将枚举<t>视为迭代器<t> </t> </t>

时间:2011-02-15 17:24:23

标签: java iterator foreach enumeration adapter

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

7 个答案:

答案 0 :(得分:29)

如果你只想在for-each循环中迭代(所以是Iterable而不仅仅是Iterator),there's always java.util.Collections.list(Enumeration<T> e)(不使用任何外部库)。

答案 1 :(得分:11)

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

Iterator iterator = new EnumerationIterator(enumeration);

答案 2 :(得分:7)

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            
}

但值得努力吗?

答案 3 :(得分:3)

无需自己动手。看看谷歌的Guava图书馆。具体地

Iterators.forEnumeration()

答案 4 :(得分:2)

没有什么是标准库的一部分。不幸的是,你必须推出自己的适配器。其他人已经做过一些例子,例如:

IterableEnumerator

答案 5 :(得分:1)

或在公共收藏中 EnumerationUtils

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

toList(myEnumeration)

答案 6 :(得分:0)

如果您可以修改课程,那么您也可以简单地实施Iterator<T>并添加remove方法..