2011-08-16 11 views
45

Ho una semplice domanda di riscossione. Ho un oggetto Set<String>. Voglio un'enumerazione delle stringhe in quel set. Qual è il modo più pulito/migliore per farlo?Java: Enumerazione dal set <String>

+1

Enumerazione come in java.util.Enumeration? Qualche ragione per non usare java.util.Iterable invece? –

+2

sì ... perché sto eseguendo l'override di un metodo che restituisce specificamente un'enumerazione . – Charlotte

+1

Penso che dovresti accettare la risposta più votata. –

risposta

26

EDIT: Non è necessario scrivere il proprio (anche se lascerò l'implementazione sotto per i posteri) - vedere la risposta di Kevin Bourrillion per quella nel JDK.


Se davvero bisogno di un'enumerazione, potrebbe potrebbe utilizzare:

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

Sarebbe meglio usare Iterable<E> se possibile anche se ...

Un'alternativa migliore è scrivere una classe di piccolo wrapper intorno a Iterator<E>. In questo modo non c'è bisogno di prendere una copia solo per trovare un imlementation di 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: cura di commentare? –

+0

Anche io ho votato. Non è necessario scrivere la propria implementazione quando il JDK ha un metodo di utilizzo statico che lo fa per te, come sottolineato da Kevin Bourrillion. – Snekse

+1

@ Snekse: se il precedente downvoter avesse detto tanto, sarebbe stato utile. Non posso cancellare la mia risposta ora perché è accettata, ma posso indicare Kevin ... –

5

Supponendo che si intende di censimento nel senso matematico il modo più pulito per farlo è attraverso un ciclo for, applicabile a qualsiasi classe che implementa Iterable:

Set<String> strs = ... 

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

Se davvero bisogno di un Enumeration si potrebbe implementare una classe adattatore per avvolgere il Iterator restituito dalla chiamata iterator(). Esiste una classe adattatore nella libreria delle raccolte di Apache: IteratorEnumeration.

Oppure si potrebbe usare libreria di Guava di Google:

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

Downvoter ...cura di commentare? – Adamski

170

java.util.Collections.enumeration(set)

Javadoc

Restituisce un'enumerazione sulla raccolta specificato. Ciò fornisce l'interoperabilità con le API legacy che richiedono un'enumerazione come input .

+8

Ok, mi rendo conto che la mia risposta è concisa, ma è perché è tutto ciò che ha davvero bisogno di essere detto. :) Questo metodo è nel JDK e fa esattamente * ciò che il poster sta chiedendo. È strano per me che sarebbe stato classificato per ultimo. –

+1

Elemento Java efficace 47: conoscere e utilizzare le librerie – Ray