2010-01-12 10 views
18

Por lo que entiendo esto, parece que no hay una forma directa de obtener un Enumeration directamente para las claves de HashMap. Solo puedo obtener un keySet(). Desde ese Set, puedo obtener un Iterator pero un Iterator parece ser algo diferente a un Enumeration.Obtener una enumeración (para las claves) de un mapa (HashMap) en Java?

¿Cuál es la mejor y más eficaz forma de obtener directamente un Enumeration de las claves de un HashMap?

Antecedentes: Estoy implementando mi propio método ResourceBundle (=>getKeys()), y tengo que proporcionar/implementar un método que devuelva la enumeración de todas las claves. Pero mi implementación se basa en un HashMap, así que tengo que encontrar la manera de convertir mejor estas dos técnicas de "Iterador/Enumerador".

+3

¿Hay alguna razón por la que necesita enumeraciones en vez de iteradores? Javadoc de Enumeration recomienda que use Iterator en su lugar. – lins314159

+1

bueno, la clase que estoy implementando requiere una enumeración: http://java.sun.com/javase/6/docs/api/java/util/ResourceBundle.html#getKeys() (vea el método getKey() allí) Lo único que podría hacer es implementarlo completamente diferente y no usar HashMap en absoluto. Sin embargo, estaría muy interesado en aprender cuál es la mejor y más eficaz forma de obtener una Enumeración de las claves de un mapa. ¡Gracias! – tim

Respuesta

20

Apache commons-collections tienen un adaptador que hace que el Iterator esté disponible para su uso como un Enumeration. Eche un vistazo al IteratorEnumeration.

adaptador para hacer una instancia iterador parece ser una instancias de enumeración

lo que en definitiva de hacer lo siguiente:

Enumeration enumeration = new IteratorEnumeration(hashMap.keySet().iterator()); 

Alternativamente, si usted (por alguna razón) Don' Si desea incluir colecciones comunes, puede implementar este adaptador usted mismo. Es fácil - simplemente hacer una implementación de Enumeration, pase el Iterator en un constructor, y siempre que hasMoreElements() y nextElement() son llamados, se llama a la hasNext() y next() en el Iterator subyacente.

Utilice esto si se ve obligado a utilizar Enumeration por algún contrato API (como supongo que es el caso). De lo contrario, use Iterator; es la opción recomendada.

+2

Colecciones de Google también admite esto mediante 'Iterators.asEnumerator()': http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Iterators.html#asEnumeration(java.util .Iterator) –

+0

hola Bozho. Gracias, especialmente interesante fue su comentario sobre cómo implementar esto por mi cuenta. Hasta ahora no me había dado cuenta de que podía hacer esto solo. – tim

+0

+1 para la lección. –

34

Creo que se puede utilizar el método de enumeración de java.util.Collections clase para lograr lo que quiere.

La documentación del API de la enumeración método tiene esto que decir:

pública enumeración Enumeración estática (Collection c)
Devuelve una enumeración más de la colección especificada. Esto proporciona interoperabilidad con API heredadas que requieren una enumeración como entrada.

Por ejemplo, el siguiente fragmento de código para crear una instancia de enumeración desde el conjunto de claves de HashMap

final Map <String,Integer> test = new HashMap<String,Integer>(); 
test.put("one",1); 
test.put("two",2); 
test.put("three",3); 
final Enumeration<String> strEnum = Collections.enumeration(test.keySet()); 
while(strEnum.hasMoreElements()) { 
    System.out.println(strEnum.nextElement()); 
} 

y dando como resultado la salida es:
uno
dos
tres

+0

+1 Esta es la manera de acceder siempre que comience con la colección. No es necesario que escriba su propio adaptador para enumerar un conjunto de claves. –

0

Puede escribir un adaptador para adaptarse a la enumeración.

public class MyEnumeration implements Enumeration { 

     private Iterator iterator; 

     public MyEnumeration(Iterator iterator){ 
      this.iterator = iterator; 
     } 


     public MyEnumeration(Map map) { 
      iterator = map.keySet().iterator(); 
     } 


     @Override 
     public boolean hasMoreElements() { 
      return iterator.hasNext(); 
     } 


     @Override 
     public Object nextElement() { 
      return iterator.next(); 
     } 

    } 

Y a continuación, puede utilizar esta enumeración personalizada :)

Cuestiones relacionadas