【问题标题】:Treat Enumeration<T> as Iterator<T>将 Enumeration<T> 视为 Iterator<T>
【发布时间】:2011-06-27 18:48:46
【问题描述】:

我有一个实现Enumeration&lt;T&gt; 接口的类,但是Java 的foreach 循环需要Iterator&lt;T&gt; 接口。 Java 的标准库中有EnumerationIterator 的适配器吗?

【问题讨论】:

  • 它更简单,不使用 Enumerator 作为其遗留类或不使用每个循环的“增强”。
  • for-each 循环需要一个 Iterable,而不是 Iterator;你真的想要哪个?

标签: java iterator foreach enumeration adapter


【解决方案1】:

如果您只想在 for-each 循环中迭代某些东西(所以是一个 Iterable 而不仅仅是一个 Iterator),there's always java.util.Collections.list(Enumeration&lt;T&gt; e)(不使用任何外部库)。

【讨论】:

  • 这是一个简单的答案,使用专门为此目的设计的标准 java 类/方法。
【解决方案2】:

您需要一个所谓的“适配器”,以使Enumeration 适应其他不兼容的Iterator。 Apache commons-collections 有EnumerationIterator。用法是:

Iterator iterator = new EnumerationIterator(enumeration);

【讨论】:

  • 这是在回答问题,因为您不能在 foreach 循环中使用迭代器。
【解决方案3】:

a) 我很确定您的意思是 Enumeration,而不是 Enumerator
b) Guava 提供了一个 Helper 方法 Iterators.forEnumeration(enumeration) 从枚举生成迭代器,但这也无济于事,因为您需要 Iterable(迭代器的提供者),而不是 Iterator
c) 你可以使用这个帮助类来做到这一点:

public class WrappingIterable<E> implements Iterable<E>{
    private Iterator<E> iterator;

    public WrappingIterable(Iterator<E> iterator){
        this.iterator = iterator;
    }

    @Override
    public Iterator<E> iterator(){
        return iterator;
    }
}

现在您的客户端代码如下所示:

for(String string : new WrappingIterable<String>(
                        Iterators.forEnumeration(myEnumeration))){
    // your code here            
}

但这值得付出努力吗?

【讨论】:

  • 你可以让你的包装构造器接受一个枚举。
  • 另请注意Iterable 表示您可以重复请求迭代器。此包装器不符合此要求。
【解决方案4】:

无需自己动手。查看 Google 的 Guava 库。具体

Iterators.forEnumeration()

【讨论】:

  • 这是一个 Iterator,而不是 Iterable。
  • @ThorbjørnRavnAndersen - OP 明确要求从 Enumeration 到 Iterator 的适配器。他没有要求 Enumeration to Iterable。
  • 他想在foreach 中使用它,因此Iterator 是一个错字。
【解决方案5】:

标准库中没有任何内容。不幸的是,您将不得不推出自己的适配器。有一些其他人做过的例子,例如:

IterableEnumerator

【讨论】:

  • 是的,标准库中有专门为此目的的东西:Collections.list
【解决方案6】:

或在 commons-collections 中 枚举工具

import static org.apache.commons.collections.EnumerationUtils.toList

toList(myEnumeration)

【讨论】:

    【解决方案7】:

    如果你可以修改类,那么你也可以简单地实现Iterator&lt;T&gt;并添加remove方法..

    【讨论】:

      猜你喜欢
      • 2010-10-14
      • 1970-01-01
      • 2013-03-06
      • 2014-03-24
      • 2013-02-18
      • 2012-06-16
      • 1970-01-01
      • 2016-11-26
      相关资源
      最近更新 更多