我在解决这个问题时遇到了一些麻烦,可能是因为我上次在 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++ 中一样,我需要将迭代器指向集合中的第一项,迭代器的整体思想是它知道它的当前位置,但我不确定是否必须明确告诉它在哪里开始?希望这是有道理的,谢谢。
最佳答案
您需要在 MyArrayList
内声明 MyIterator
类。其效果是,当创建 MyIterator
的实例时,它将与 MyArrayList
类的实例关联,并且能够访问MyArrayList
的成员(包括私有(private)成员)。这样,您的迭代器将能够访问数组以及您为当前长度定义的任何变量。
正如 Josh 所说,itr
变量不应声明 itr
变量,而 iterator()
应该使用 new MyIterator
。新的 MyIterator
对象将自动与调用 new MyIterator
的同一个 MyArrayList
对象关联(有一种语法可以将其与不同的 >MyArrayList
但我想你在这里不需要它)。在 MyIterator
内,这些方法将能够访问 array
和其他 MyArrayList
字段。 MyIterator
的构造函数将负责所需的任何初始化;您可能需要在 MyIterator
中使用某种“当前索引”字段,并且构造函数将初始化它。
有关嵌套类的更多信息:http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html .
关于java - 将迭代器指向 Java 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18668714/