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在于,您最终会得到两个迭代器的一个迭代器状态,并且推进iter2会影响iter1.

当然,干净的解决方案是在您的Iterable实现中拥有一个私有类来实现Iterator,并为每次iterator()调用创建一个新实例。iter1然后iter2引用不同的对象,并改变iter2不影响的状态iter1

于 2013-03-02T07:54:24.030 回答