2

有人可以给我一个示例,说明将迭代器添加到 Java 5 的可迭代接口之前的自定义类的最佳方法吗?

包装 Collection 是最好的选择吗?就像是

public Iterator iterator() {
    return wrappedCollection.iterator();
}

在我最初的帖子中,我将 Iterator 与 Iterable 混淆了。我感兴趣的最终结果是能够使用以下内容对自定义类进行操作。

Iterator it = customClass.iterator();
while (it.hasNext()) {
    //do stuff
}
4

6 回答 6

4

您是否添加了一个看起来像的方法

public Iterator iterator() {
    return new YourCustomIterator(...);
}

?

于 2009-06-12T18:49:24.077 回答
4

如果您只是包装一个集合,您可以使用转发方法。

public class Custom implements Collection {
    Collection c; // create an instance here or in the constructor
    ...

    // forwarding method
    public Iterator iterator()
    {
        return c.iterator();
    }
}

不过,我认为最好实现您要包装的任何类型的集合接口,而不是迭代器。

于 2009-06-12T18:58:54.880 回答
1

听起来您刚刚添加了那些包含 Collection 的类的方法。在这种情况下,您的对象现在也是您的迭代器。您可能打算做的是创建一个实现 Iterator 的新类,并通过 iterator() 方法使用您的 Collection 的克隆进行实例化。

于 2009-06-12T18:52:46.690 回答
1

如果您只想公开内部集合的迭代器,则只需返回该集合迭代器。如果你想做更多的事情,你要么必须自己包装,要么查看 Apache Commons Collections 包,其中包含相当多的迭代器构建器和修饰器方法。(即使你不能使用他们的方法,他们的实现也应该教会你很多关于构建迭代器的知识。)

于 2009-06-12T18:54:41.817 回答
1

您希望该集合具有一个迭代器方法,该方法根据需要返回一个私有 Iterator 类的实例。

public class IterableTest
{
    public Iterator iterator()
    {
        return new IteratorTest();
    }
    private class IteratorTest implements Iterator
    {
        public boolean hasNext(){...}

        public Object next(){...}

        public void remove(){...}
    }
}
于 2009-06-12T18:57:21.653 回答
1

我猜你正在寻找类似下面的东西

http://karephul.blogspot.com/2009/05/concurrentmodificationexception.html

是的,内部阶级的想法是你正在寻找的。

于 2009-06-12T19:23:25.633 回答