2

宿題: 完全なコードを投稿せずにガイドしてください

私のインストラクターは、宿題として LinkedList を実装するように指示しています。クラスのシェルのヘッダーは次のとおりです。

public class LinkedList<T> implements Iterable<T>, Iterator<T>

彼が Iterable および Iterator インターフェースを実装していることに注意してください。次に、クラスに iterator()、hasNext()、next()、remove() メソッドを実装する必要があることを理解しました。しかし、私を混乱させているのは、彼が Iterator インターフェースに必要なメソッドを別の内部クラスに入れていないことです。以下のメソッドはすべて LinkedList クラスで定義されています。

/*
 * (non-Javadoc)
 * 
 * @see java.lang.Iterable#iterator()
 */
@Override
public Iterator<T> iterator()
{
    return null;
}

/*
 * (non-Javadoc)
 * 
 * @see java.util.Iterator#hasNext()
 */
@Override
public boolean hasNext()
{
    return false;
}

/*
 * (non-Javadoc)
 * 
 * @see java.util.Iterator#next()
 */
@Override
public T next()
{
    return null;
}

/*
 * (non-Javadoc)
 * 
 * @see java.util.Iterator#remove()
 */
@Override
public void remove()
{

}

iterator() メソッドは次のようなものを返すべきではありません:

public Iterator<T> iterator()
{
    return new MyClassIterator(front);
}

whereMyClassIterator()hasNext()next()、およびremove()メソッドで定義されます。私は何が欠けていますか?

4

1 に答える 1

5

これは実際にはコメントですが、コメント形式では長すぎて読みにくいため、回答として投稿する必要があります。

Iterable実装を実装する場合は十分に注意してくださいIterator。同時に複数のイテレータが実行されている可能性がありますIterable。これを示すテスト プログラムを次に示します。

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class Test {
  public static void main(String[] args) {
    List<String> myList = Arrays.asList(new String[] { "aaa", "bbb", "ccc" });
    Iterator<String> iter1 = myList.iterator();
    System.out.println("iter1: " + iter1.next());
    System.out.println("iter1: " + iter1.next());
    Iterator<String> iter2 = myList.iterator();
    for (String s; iter2.hasNext();) {
      s = iter2.next();
      System.out.println("iter2: " + s);
    }
    System.out.println("iter1.hasNext(): " + iter1.hasNext());
    System.out.println("iter2.hasNext(): " + iter2.hasNext());
    System.out.println("iter1: " + iter1.next());
  }
}

それは印刷します:

iter1: aaa
iter1: bbb
iter2: aaa
iter2: bbb
iter2: ccc
iter1.hasNext(): true
iter2.hasNext(): false
iter1: ccc

Iterable実装することのリスクはIterator、両方のイテレータに対して 1 つのイテレータ状態になってしまい、先に進むiter2と に影響することiter1です。

もちろん、クリーンな解決策は、実装にIterableを実装するプライベート クラスを用意し、呼び出しIteratorごとにその新しいインスタンスを作成することです。その後、別のオブジェクトを参照し、状態への変更は影響しません。iterator()iter1iter2iter2iter1

于 2013-03-02T07:54:24.030 に答える