2

Collection と Iterable を実装するクラスを作成しました。現在、強化された for ループを使用して実行しようとしています。ここで見つけることができます: LinkedQueue

このクラスのポイントは、正常に機能する LinkedQueue.getNext() を使用してコレクションを通過できるようにすることです。ただし、for ループを使用して一度値を反復できるようにしたいと考えています。現在のコード:

LinkedQueue<String> queue = new LinkedQueue();
queue.add("Test one");
queue.add("Test two");
queue.add("Test three");
System.out.println("queue.size = " + queue.size());
System.out.println("contents:");
for (String s : queue) {
    System.out.print("Test: ");
    System.out.println(s);
}
System.out.println("contents (x9):");
for (int i = 0; i < 9; i++) {
    System.out.println(queue.getNext());
}

これを印刷します:

queue.size = 3
contents:
contents (x9):
Test one
Test two
Test three
...etc...

そのため、for ループが正しく印刷されていないようです。開始前のキューのサイズは 3 であるため、サイズの問題ではないと思います。だから今、私の問題はおそらく「反復可能なメソッドの何が問題なのか」です. hasNext()next()、およびremove()(このキューではサポートされていません)。私は何を間違っていますか?

4

1 に答える 1

3

(暗黙的に) を呼び出すiterator()と、itr変数はまだ「null値」ノードだけを参照しているため、実装は失敗しています。メソッドで他の値に設定するだけで、next()後で呼び出されることはありません。

しかし、もっと深刻な設計上の問題があります。基本的に、コレクションはそれ自体を実装することはほとんどありませんiterator()。通常、コレクションを複数回反復できるはずです。同時に複数のイテレーターを使用する可能性があり、すべて独立している必要があります。コレクションを繰り返し処理しても変更されません。

何を達成しようとしているのかは完全には明らかではありませんが、iterator()実装では、ほとんどの場合、元のコレクションを参照するが変更しない可変状態の新しいオブジェクトを作成する必要があります。

于 2013-10-19T21:37:08.800 に答える