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

Pat*_*t K 2 java iterator iterable linked-list

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

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

public class LinkedList<T> implements Iterable<T>, Iterator<T>
Run Code Online (Sandbox Code Playgroud)

请注意,他正在实现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()
{

}
Run Code Online (Sandbox Code Playgroud)

iterator()方法不应该返回类似于:

public Iterator<T> iterator()
{
    return new MyClassIterator(front);
}
Run Code Online (Sandbox Code Playgroud)

MyClassIterator()与定义hasNext(),next()remove()方法.我错过了什么?

Pat*_*han 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());
  }
}
Run Code Online (Sandbox Code Playgroud)

它打印:

iter1: aaa
iter1: bbb
iter2: aaa
iter2: bbb
iter2: ccc
iter1.hasNext(): true
iter2.hasNext(): false
iter1: ccc
Run Code Online (Sandbox Code Playgroud)

拥有该Iterable工具的风险Iterator在于,对于两个迭代器,您将最终得到一个迭代器状态,并且前进iter2将会影响iter1.

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