2011-06-29 18 views
0

リンクリスト実装のスタック要素を印刷しようとしました。Javaで静的変数を使用

しかし、スタック自体の順序で印刷するには、Javaで静的変数が必要です。

public void display() 
{ 
<STATIC> <here I need> LinkedListImp temp = this; 

    while(temp.next!=null) 
    { 
    temp=temp.next; 
    display(); 
    } 

    System.out.println("\n\t"+ temp.element +"\n");; 
} 

しかし、このように宣言しているうちにエラーが発生します。

インターフェイスコンセプトでdisplay()を実装しました。したがって、私は表示することができません(LinkedListImpの温度)。例えば

interface StackMethods 
{ 
    int pop(); 
    void push(int numberint); 
    void display(); 
} 

、 スタックの要素が1、次いで2次に3 場合欲しいむしろ1 2 3または1(改行)2(改行)3.
として出力したいdidntの3として(改行) 2(改行) (本当のスタックを実証する必要がありませんが)1

はこれを実装する他の方法はありますか?

+0

なぜ静的ローカル変数が必要だと思いますか?これを実現するにはどうしたらいいですか? –

+0

基本的な言語の詳細に関する本が役立つと思います。 – fyr

+0

メソッドの内部に静的変数が必要なのはなぜですか? Javaの静的な意味は、C++の静的な静的なものとは異なる意味です。 – justkt

答えて

1

tempの値がdisplay()の親クラス(LinkedListImp?)のインスタンスに依存しないようにするには、静的なクラス変数が必要です。 Javaでは、staticキーワードは、個々のインスタンスではなく、クラス全体に属する変数をマークします。 JavaのStaticは、「クラス変数」とも呼ばれる変数を作成します。定義上、クラス変数はローカルにすることはできません。静的変数の詳細については、documentationの内容を参照するか、this StackOverflow question that has the spec in an answerを参照してください。

しかし、それはあなたがやろうとしているかのように見えますが、あなたがいないは、静的変数をしたいですか意味クラスのインスタンスを、使用しています。あなたは絶対にクラスに結び付けられた価値を求めています。

しかし、動作させるには、whileループの両方のステートメントの周りに中括弧が必要です。それ以外の場合は、リンクされたリストのすべての要素をループし、最後のものだけを出力するプログラムを取得します。これは、ブロックステートメント(ifelseforwhileなど)の後に中括弧がない場合、Javaではブロックの内容として次の行のみを扱うためです。

​​

私はStringBuilderを使用して文字列を構築したいループとここ順序を逆にします。

public void display() 
{ 
    LinkedListImp temp = this; 
    StringBuilder result = new StringBuilder(); 
    while(temp.next!=null) 
    { 
     result.insert(0, "\n\t"+ temp.element +"\n"); // put the result at the front 
     temp=temp.next; 
    } 
    System.out.println(result.toString()); 
} 

編集に基づいて、メソッドに再帰呼び出しを追加しましたが、これはループでは必要ありません。再帰を行う場合は、ループを削除します。その場合、再帰はとなり、ループはとなります。その場合は、次の項目を逆順に表示するか、標準注文の前に表示するだけで項目を印刷してください。

public display() { 
    doDisplay(this); 
} 

private void doDisplay(LinkedListImpl item) { 
    if(item.next) // implicit != null 
    { 
     doDisplay(item.next); 
    } 
    System.out.println("\n\t" + temp.element + "\n"); // this line goes before 
                 // the if statement for 
                 // regular ordering 
} 
+0

@justkt - あなたのコードは、最初の要素の表示をスキップしています。私たちが投票できるように修正することができますか?ありがとう。 **編集**あなたが入れた2番目の例は、リスト要素の逆の表示を行うことです。 – Perception

+0

@受取 - 良いキャッチ、編集済み。 – justkt

+0

@justktあなたは今私の質問を見ることができますか?私はそれを編集しました –

0

Javaには、Cのようにファンクション内で静的変数を宣言する機能はありません。私はなぜこの静的変数が必要だと思うのか理解できません。

+0

私は自分の質問を編集しました。私は再帰呼び出しを残しました。今すぐ私の質問を参照してください –

0

static変数は、staticキーワードを持つ通常のインスタンス変数と同様に宣言されています。方法でそれらを宣言することは違法です。また、変数に代入する代わりにthisを使用するだけではどうですか?

0

逆の順序であなたのリストを印刷するためには、ヘルパーメソッドを使用することができます。

public void display() { 
    displayHelper(this); 
} 

private void displayHelper(LinkedListImp temp) { 
    if (temp.next != null) 
     displayInternal(temp.next); 

    System.out.println("\n\t"+ temp.element +"\n");; 
} 
+0

hernandez rishmawyあなたに素晴らしいアイデアをありがとう –

0

再帰が正常に動作します。ヘルパーメソッドは必要ありません。

public void display() 
{ 
    // Displays in reverse order. For forwards order, do it the other way around. 
    if (next != null) { next.display(); } 
    System.out.println("\n\t"+ element +"\n"); 
}