2011-02-15 27 views
13

Tengo una clase que implementa la interfaz Enumeration<T>, pero el bucle foreach de Java requiere la interfaz Iterator<T>. ¿Hay un adaptador Enumeration a Iterator en la biblioteca estándar de Java?Tratar Enumeración <T> como Iterator <T>

+0

Es mucho más simple que cualquiera, no utilizar Enumerator como una clase heredada o no usar el "mejorado" para cada ciclo. –

+4

El bucle for-each requiere un Iterable, no un Iterator; ¿Qué es lo que realmente quieres? –

Respuesta

9

Se necesita una llamado "Adaptador", para adaptar el Enumeration al Iterator que de otro modo sería incompatible. Apache commons-collections tiene EnumerationIterator. El uso es:

Iterator iterator = new EnumerationIterator(enumeration); 
+0

+1 en Apache Commons – vz0

+1

esto está respondiendo la pregunta, porque no puede usar un iterador en un bucle foreach. –

2

No hay nada que sea parte de la biblioteca estándar. Lamentablemente deberás rodar tu propio adaptador. Hay ejemplos por ahí de lo que otros han hecho, por ejemplo:

IterableEnumerator

+0

Sí, hay algo en la biblioteca estándar específicamente para este propósito: Collections.list – aeropapa17

0

Si se puede modificar la clase a continuación, sólo tiene que poner en práctica Iterator<T> demasiado y añadir el método remove ..

7

a) Estoy bastante seguro de que quiere decir Enumeration, no Enumerator
b) Guava proporciona un método de ayuda Iterators.forEnumeration(enumeration) que genera un iterador de una enumeración, pero eso no le servirá de nada , ya que necesita un Iterable (un proveedor de iteradores), no un Iterator
c) que podría hacerlo con esta clase de ayuda:

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; 
    } 
} 

Y ahora su código de cliente se vería así:

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

Pero es que vale la pena el esfuerzo?

+0

Puede permitir que su constructor de envoltura acepte una enumeración. –

+3

También tenga en cuenta que 'Iterable' significa que puede solicitar el iterador repetidamente. Este contenedor no cumple con eso. –

3

No hay necesidad de hacer las suyas. Mire la biblioteca de Guava de Google. Específicamente

Iterators.forEnumeration() 
+1

Eso hace un iterador, no un Iterable. –

+0

@ ThorbjørnRavnAndersen - El OP pidió explícitamente un adaptador de Enumeration to Iterator. Él no pidió la enumeración a Iterable. – rfeak

+2

Quiere usarlo en 'foreach', por lo tanto,' Iterator' es un error tipográfico. –

1

o en bienes comunes colecciones EnumerationUtils

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

toList(myEnumeration) 
27

Si lo que desea es algo para repetir en un bucle for-each (por lo que un Iterable y no sólo un iterador), there's alwaysjava.util.Collections.list(Enumeration<T> e) (sin utilizar ninguna biblioteca externa).

+1

Esta es una respuesta simple, utilizando una clase/método Java estándar específicamente diseñado para este propósito. – aeropapa17