【问题标题】:Point an iterator to an object Java?将迭代器指向对象Java?
【发布时间】: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&lt;T&gt; 实例。
  • 当然。您的MyIterator 类将需要一个字段(可能是int)来告诉它接下来要返回哪个元素。这需要从零开始。但正如 Josh 所说,在 iterator() 方法中创建您的迭代器,而不是将其作为 MyArrayList 的字段。
  • 所以如果我需要在我的列表类的辅助方法中使用它,我需要像下面这样调用它? TheArrayListIterator&lt;T&gt; itr = iterator(); 迭代器方法现在每次调用时都会返回一个迭代器的新实例。编辑:也打败我,谢谢!
  • @gRnt 您一直在更改您的评论,因此很难回答。但我确实认为每次要迭代时最好创建一个新的迭代器。如果每个数组只有一个迭代器,如果一个循环遍历数组的方法调用另一个也想循环遍历同一个数组的方法,就会遇到问题。
  • 对不起,因为我一直试图让内联代码格式化工作并且我总是打破它,试图让写得好的 cmets 有意义我尝试修复它并不断打破它,将避免以后使用太多代码,谢谢。

标签: java iterator


【解决方案1】:

您需要声明MyIterator内部 MyArrayList。效果是当MyIterator 的实例被创建时,它将与MyArrayList 类的实例关联,并且它将能够访问MyArrayList 的成员(包括私人成员)。这样,您的迭代器将能够访问 array 以及您为当前长度定义的任何变量。

正如 Josh 所说,iterator() 应该使用 new MyIterator,而不是声明 itr 变量。新的MyIterator 对象将自动与调用new MyIterator 的同一MyArrayList 对象相关联(有一种语法可以将它与不同的MyArrayList 相关联,但我认为这里不需要它)。在MyIterator 内部,这些方法将能够访问array 和其他MyArrayList 字段。 MyIterator 的构造函数将负责所需的任何初始化;您可能需要MyIterator 中的某种“当前索引”字段,构造函数将对其进行初始化。

更多关于嵌套类:http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    相关资源
    最近更新 更多