2011-02-15 64 views
13

我有一个类实现了Enumeration<T>接口,但Java的foreach循环需要Iterator<T>接口。 Java标准库中是否有EnumerationIterator适配器?将枚举<T>作为迭代器使用<T>

+0

它更简单一些,不使用枚举器作为其遗留类或不使用每个循环的“增强”。 – 2011-02-15 17:40:51

+4

for-each循环需要Iterable,而不是Iterator;你真的想要哪个? – 2012-04-10 21:22:21

回答

9

你需要一个所谓的“适配器”,以使Enumeration适应不兼容的Iterator。 Apache公共收藏有EnumerationIterator。用法:

Iterator iterator = new EnumerationIterator(enumeration); 
+0

+1 Apache Commons – vz0 2011-02-15 17:38:23

+1

这回答了这个问题,因为您不能在foreach循环中使用迭代器。 – 2013-01-18 14:37:52

2

没有什么是标准库的一部分。不幸的是,你将不得不推出自己的适配器。有例子在那里别人怎么做了,例如:

IterableEnumerator

+0

是的,标准库中有一些专门用于此目的的东西:Collections.list – aeropapa17 2016-05-02 17:12:24

0

如果你可以修改类,那么你可以简单地实现Iterator<T>过,并添加remove方法..

7

一)我敢肯定你的意思Enumeration,不Enumerator
B)Guava提供了一个辅助方法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    
} 

但是这是值得的?

+0

你可以让你的包装构造函数接受一个枚举。 – 2012-04-10 19:07:13

3

没有必要推出自己的。看看Google的Guava图书馆。具体

Iterators.forEnumeration() 
1

或公共的集合 EnumerationUtils

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

toList(myEnumeration) 
27

如果你只是想要的东西在一个for-each循环(所以一个可迭代遍历并不仅是一个迭代器),there's alwaysjava.util.Collections.list(Enumeration<T> e)(不使用任何外部库)。