Java:实现自己的链接LIst - >在哪里定义hasNext(),next(),remove()?

时间:2013-03-02 06:28:42

标签: java iterator linked-list iterable

家庭作业:请指导我帮助指导我,而不发布完整的代码

我的导师让我们将LinkedList实现为家庭作业。这是类的shell的标题:

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);
}

使用MyClassIterator()hasNext()next()方法定义remove()的位置。我错过了什么?

1 个答案:

答案 0 :(得分: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()调用创建一个新实例。 iter1iter2然后引用不同的对象,对iter2状态的更改不会影响iter1