【发布时间】:2013-09-07 01:18:16
【问题描述】:
我在解决这个问题时遇到了一些麻烦,这可能是因为我上次在 C++ 中做过这种事情,它略有不同,但我遇到了以下问题。
我必须编写一个自定义的 ArrayList 类和一个关联的迭代器。我已经实现了如下所示的基本类结构:
public class MyArrayList<T> implements Iterable<T> {
protected T[] array;
private MyIterator<T> itr = new MyIterator<T>();
public MyArrayList() {
array = (T[]) new Object[10];
}
public MyArrayList(int i) {
array = (T[]) new Object[i];
}
@Override
public Iterator<T> iterator() {
return itr;
}
private class MyIterator<T> implements Iterator<T> {
@Override
public void remove() {
}
@Override
public T next() {
return null;
}
@Override
public boolean hasNext() {
return true;
}
}
}
显然,我仍在添加代码,但我刚刚实现了现在需要的内容,以消除所有错误消息。我现在要做的是将名为 itr 的迭代器链接到列表构造函数中数组中的第一个元素。
就像在带有指针的 C++ 中一样,我是否需要将迭代器指向我的集合中的第一项,迭代器的整个想法是它知道它的当前位置,但我不确定我是否必须明确告诉它在哪里开始?希望这是有道理的谢谢。
【问题讨论】:
-
注意:您应该在每次调用
iterator();时创建一个新的MyIterator<T>实例。 -
当然。您的
MyIterator类将需要一个字段(可能是int)来告诉它接下来要返回哪个元素。这需要从零开始。但正如 Josh 所说,在iterator()方法中创建您的迭代器,而不是将其作为MyArrayList的字段。 -
所以如果我需要在我的列表类的辅助方法中使用它,我需要像下面这样调用它?
TheArrayListIterator<T> itr = iterator();迭代器方法现在每次调用时都会返回一个迭代器的新实例。编辑:也打败我,谢谢! -
@gRnt 您一直在更改您的评论,因此很难回答。但我确实认为每次要迭代时最好创建一个新的迭代器。如果每个数组只有一个迭代器,如果一个循环遍历数组的方法调用另一个也想循环遍历同一个数组的方法,就会遇到问题。
-
对不起,因为我一直试图让内联代码格式化工作并且我总是打破它,试图让写得好的 cmets 有意义我尝试修复它并不断打破它,将避免以后使用太多代码,谢谢。