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>
Respuesta
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);
+1 en Apache Commons – vz0
esto está respondiendo la pregunta, porque no puede usar un iterador en un bucle foreach. –
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:
Sí, hay algo en la biblioteca estándar específicamente para este propósito: Collections.list – aeropapa17
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
..
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?
Puede permitir que su constructor de envoltura acepte una enumeración. –
También tenga en cuenta que 'Iterable' significa que puede solicitar el iterador repetidamente. Este contenedor no cumple con eso. –
No hay necesidad de hacer las suyas. Mire la biblioteca de Guava de Google. Específicamente
Iterators.forEnumeration()
Eso hace un iterador, no un Iterable. –
@ ThorbjørnRavnAndersen - El OP pidió explícitamente un adaptador de Enumeration to Iterator. Él no pidió la enumeración a Iterable. – rfeak
Quiere usarlo en 'foreach', por lo tanto,' Iterator' es un error tipográfico. –
o en bienes comunes colecciones EnumerationUtils
import static org.apache.commons.collections.EnumerationUtils.toList
toList(myEnumeration)
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).
Esta es una respuesta simple, utilizando una clase/método Java estándar específicamente diseñado para este propósito. – aeropapa17
- 1. Java: Enumeración del conjunto <String>
- 2. Crear lista <T> instancia de Iterator <T>
- 3. Java: cómo obtener Iterator <Character> desde String
- 4. 'std :: vector <T> :: iterator it;' no compila
- 5. Algo así como imprimir END << END; en C++?
- 6. C++ utilizando stringstream después << como parámetro
- 7. cómo usar>< <= > = como funciones?
- 8. ¿Qué es impresión << EOF; y como esta funcionando?
- 9. Diferencia entre enumeración <? extiende ZipEntry> y Enumeration <ZipEntry>?
- 10. ¿Qué significa "NSBinarySearchingFirstEqual = (1UL << 8)" en una definición de enumeración?
- 11. <% $, <% @, <% =, <% # ... ¿cuál es el problema?
- 12. ¿Cómo mostrar todos los valores de una enumeración como elementos <option>?
- 13. expresión PHP <<< EOB
- 14. En PHP, ¿qué representa "<<<"?
- 15. Php ¿qué significa <<<?
- 16. Convertir <Enum> a la lista <string>
- 17. EJS: <% = versus <% -
- 18. ¿Cómo funciona <: <?
- 19. cout << stringstream
- 20. sobrecarga de operadores << - C++
- 21. operator << overloading ostream
- 22. ¿Son inútiles los elementos HTML5 nuevos como <section> y <article>?
- 23. << operador y recursividad
- 24. ¿Qué significa el operador de Bash <<<?
- 25. Haciendo operador << virtual?
- 26. <%# %> vs <%= %>
- 27. <: <operador en scala
- 28. StringTemplate eliminar < > como delimitadores
- 29. Use <canvas> como fondo CSS
- 30. ¿Cómo funciona exactamente la implementación de Scala de <: <, <% <, =: = en el compilador?
Es mucho más simple que cualquiera, no utilizar Enumerator como una clase heredada o no usar el "mejorado" para cada ciclo. –
El bucle for-each requiere un Iterable, no un Iterator; ¿Qué es lo que realmente quieres? –