2011-08-16 18 views
45

Tengo una pregunta de colecciones simple. Tengo un objeto Set<String>. Quiero una enumeración de las cadenas en ese conjunto. ¿Cuál es la mejor/más limpia forma de hacerlo?Java: Enumeración del conjunto <String>

+1

Enumeración como en java.util.Enumeration? ¿Alguna razón para no usar java.util.Iterable en su lugar? –

+2

sí ... porque estoy anulando un método que devuelve específicamente una Enumeración . – Charlotte

+1

Creo que debería aceptar la respuesta más votada. –

Respuesta

26

EDITAR: No es necesario que escriba la suya (aunque dejaré la implementación a continuación para la posteridad) - vea la respuesta de Kevin Bourrillion para la del JDK.


Si realmente necesita una enumeración, podría podría utilizar:

Enumeration<String> x = new Vector(set).elements(); 

Sería mejor utilizar Iterable<E> si es posible, aunque ...

Una mejor alternativa es para escribir una pequeña clase de contenedor alrededor de Iterator<E>. De esa manera usted no tiene que tomar una copia sólo para encontrar un imlementation de Enumeration<E>:

import java.util.*; 

class IteratorEnumeration<E> implements Enumeration<E> 
{ 
    private final Iterator<E> iterator; 

    public IteratorEnumeration(Iterator<E> iterator) 
    { 
     this.iterator = iterator; 
    } 

    public E nextElement() { 
     return iterator.next(); 
    } 

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

} 


public class Test { 
    public static void main(String[] args) { 
     Set<String> set = new HashSet<String>(); 
     Enumeration<String> x = new IteratorEnumeration<String>(set.iterator()); 
    } 
} 
+0

@Downvoter: ¿me gustaría comentar? –

+0

Acabo de votar también. No es necesario que escriba su propia implementación cuando el JDK tiene un método de utilidad estática que lo hace por usted, como lo señaló Kevin Bourrillion. – Snekse

+1

@Snekse: Si el anterior downvoter hubiera dicho tanto, hubiera sido útil. No puedo eliminar mi respuesta ahora, ya que es la aceptada, pero puedo señalar la ... –

5

Suponiendo que quiere decir enumeración en el sentido matemático de la forma más limpia de hacer esto es a través de una, aplicable para el bucle a cualquier clase que implementa Iterable:

Set<String> strs = ... 

for (String s : strs) { 
... 
} 

Si realmente necesita una Enumeration se podría implementar una clase adaptador para envolver el Iterator devuelta al llamar iterator(). Hay una clase de adaptador en la biblioteca de colecciones de Apache: IteratorEnumeration.

O usted podría utilizar la biblioteca de guayaba de Google:

Set<String> mySet = ... 
Enumeration<String> = Iterators.asEnumeration(mySet.iterator()); 
+1

Downvoter ...importa comentar? – Adamski

170

java.util.Collections.enumeration(set)

Javadoc

Devuelve una enumeración más de la colección especificada. Esto proporciona interoperabilidad con API heredadas que requieren una enumeración como entrada .

+8

Ok, me doy cuenta de que mi respuesta es escueta, pero eso es porque eso es todo lo que se necesita decir. :) Este método está en el JDK y hace * exactamente * lo que el póster está pidiendo. Es extraño para mí que sea el último clasificado. –

+1

Artículo Java eficaz 47: Conozca y use las bibliotecas – Ray