2011-08-16 12 views
45

Mam proste pytanie o kolekcje. Mam obiekt Set<String>. Chcę wyliczyć ciągi w tym zestawie. Jaki jest najczystszy/najlepszy sposób na zrobienie tego?Java: Wyliczenie z zestawu <String>

+1

Wyliczenie jak w java.util.Enumeration? Każdy powód, aby nie używać java.util.Iterable zamiast? –

+2

tak .. ponieważ nadpisuję metodę, która specyficznie zwraca wyliczenie . – Charlotte

+1

Myślę, że powinieneś zaakceptować najczęściej wybieraną odpowiedź. –

Odpowiedz

26

EDYCJA: Nie ma potrzeby pisania własnych (chociaż zostawię implementację poniżej dla potomności) - zobacz odpowiedź Kevina Bourrilliona na tę z JDK.


Jeśli naprawdę trzeba wyliczenie może przydałby:

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

Byłoby lepiej używać Iterable<E> jeśli w ogóle możliwe, choć ...

Lepszą alternatywą jest napisać małą klasę otokową około Iterator<E>. W ten sposób nie trzeba wziąć kopię tylko znaleźć imlementation z 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

@Dvvovator: Chcesz komentarz? –

+0

Ja również głosowałem w dół. Nie ma potrzeby pisania własnych implementacji, gdy JDK ma metodę statycznego wykorzystania, która robi to dla ciebie, jak wskazał Kevin Bourrillion. – Snekse

+1

@Snekse: Jeśli poprzedni downvoter powiedział tak samo, to byłoby pomocne. Nie mogę teraz usunąć mojej odpowiedzi, ponieważ jest to zaakceptowana, ale mogę wskazać na Kevina ... –

5

Zakładając znaczy wyliczanie w sensie matematycznym najczystszy sposób to zrobić to za pośrednictwem dla pętli, dotyczy dowolnego klasa, która implementuje Iterable:

Set<String> strs = ... 

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

Jeśli naprawdę wymagają Enumeration można zaimplementować klasę adaptera zawinąć Iterator zwrócony przez wywołanie iterator(). W bibliotece zbiorów Apache znajduje się klasa adaptera: IteratorEnumeration.

Albo można użyć biblioteki Guava Google:

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

Downvoter ...czy chcesz się wypowiedzieć? – Adamski

170

java.util.Collections.enumeration(set)

Javadoc

Zwraca wyliczanie nad określonej kolekcji. Zapewnia to zgodność operacyjną ze starszymi API, które wymagają wyliczenia jako wejścia .

+8

Ok, zdaję sobie sprawę, że moja odpowiedź jest lakoniczna, ale to dlatego, że to wszystko, co naprawdę trzeba powiedzieć. :) Ta metoda jest w JDK i robi * dokładnie * to, o co pyta plakat. To dla mnie dziwne, że byłby na ostatnim miejscu. –

+1

Efektywna Java Pozycja 47: Znajomość bibliotek i korzystanie z nich – Ray