【问题标题】:Examples of how to add an iterator to a custom class in Java 1.4?Java 1.4 中如何为自定义类添加迭代器的示例?
【发布时间】:2009-06-12 18:47:11
【问题描述】:

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

包装一个集合是最好的选择吗?类似的东西

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

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

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

【问题讨论】:

  • 这是我的糟糕时刻之一,抱歉。在发布这个问题之前,我应该再给自己几分钟。感谢所有试图帮助我的人。

标签: java iterator java1.4


【解决方案1】:

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

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

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

不过,我认为最好实现您要包装的任何类型的 Collection 接口,而不是 Iterator。

【讨论】:

  • 为什么要实现迭代器呢?
  • @mmyers:最初的问题(现已编辑)引导我走上这条路。我认为这不是一个好主意,正如我在您撰写评论时所做的编辑中所说的那样。
  • 是的,我阅读了原始问题。我只是通过说出您在编辑中所说的话来开始回答(这样人们就不会误解它)。 :)
  • 直到我提交了我的答案并阅读了几次之后,我才想到这一点。 :)
【解决方案2】:

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

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

?

【讨论】:

  • 如果他的对象实现了迭代器,也可以简单地return this;
  • 哦,是的,Iterator 接口用于实际的迭代器本身。我非常专注于重新创建可迭代对象,我自己都搞糊涂了。
  • 但是仔细想想,你真的,真的不希望你的集合成为迭代器。然后它只会在你第一次迭代它时起作用。
  • 所以我应该可以做 iterator() { return collection.iterator(); },没有不良副作用吧?
  • @nemo:如果你只是包装一个集合,那么是的,这就是这样做的方式。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 点了。但是内部类的想法仍然存在。
      【解决方案6】:

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

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

      & 是的,内部类的想法正是您要寻找的。​​p>

      【讨论】:

        猜你喜欢
        • 2013-10-15
        • 2013-03-08
        • 1970-01-01
        • 2018-04-14
        • 2020-01-03
        • 1970-01-01
        • 2021-02-27
        • 2010-11-20
        • 2018-07-16
        相关资源
        最近更新 更多