家庭作业:请指导我帮助指导我,而不发布完整的代码
我的导师让我们将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()
的位置。我错过了什么?
答案 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()
调用创建一个新实例。 iter1
和iter2
然后引用不同的对象,对iter2
状态的更改不会影响iter1
。