2013-05-03 18 views
62

Szukam bardzo prostego sposobu na stworzenie zestawu.Czy .asSet (...) istnieje w dowolnym interfejsie API?

Arrays.asList("a", "b" ...) tworzy List<String>

Czy jest coś podobnego do Set?

+0

możliwy duplikat [Java - łatwo konwertuj tablicę do ustawienia] (http://stackoverflow.com/questions/3064423/java-easily-convert-array-to-set) –

+1

to nie jest, creatin g a Ustaw i konwertowanie tablicy na zbiór to nie to samo – cahen

Odpowiedz

19

Teraz z Java 8 można to zrobić bez potrzeby osób trzecich struktura:

Set<String> set = Stream.of("a","b","c").collect(Collectors.toSet()); 

Zobacz Collectors.

Ciesz się!

+1

Obecnie z Java 8 jest to prawdopodobnie najlepsza odpowiedź, ponieważ nie zależy od bibliotek zewnętrznych i może być łatwo zaadaptowana do innej kolekcji typy, więc ustawiam to jako zaakceptowane. Wielkie dzięki dla innych wspaniałych rozwiązań. (przy okazji, ten zestaw jest zmienny) – cahen

+0

Kto powiedział, że Java jest zbyt gadatliwa? Oczywiście jest to najlepsza odpowiedź! – BobDoolittle

+0

Bardzo dziękuję @BobDoolittle! –

36

Można użyć

new HashSet<String>(Arrays.asList("a","b")); 
2

no ale można to zrobić jak ten

new HashSet<String>(Arrays.asList("a", "b", ...)); 
49

Korzystanie Guava, to takie proste:

Set<String> mySet = ImmutableSet.<String> of("a", "b"); 

lub na zmienny zestaw:

Set<String> mySet = Sets.newHashSet("a", "b") 

Więcej typów danych zobaczyć Guava user guide

+0

Czy istnieje niezmienna wersja tego? – cahen

+3

@cahen yes: 'Sets.newHashSet (" a "," b ")' lub 'Sets.newLinkedHashSet (" a "," b ")' –

+1

Dodałem wariant zmienny do odpowiedzi. –

14

Jak mówili inni, zastosowanie:

new HashSet<String>(Arrays.asList("a","b")); 

Powód to robi nie istnieć w Javie jest Arrays.asList Zwraca wielkości lista stałe, innymi słowy:

public static void main(String a[]) 
{ 
    List<String> myList = Arrays.asList("a", "b"); 
    myList.add("c"); 
} 

Powroty:

Exception in thread "main" java.lang.UnsupportedOperationException 
    at java.util.AbstractList.add(Unknown Source) 
    at java.util.AbstractList.add(Unknown Source) 

Nie ma realizacja JDK o „stałej wielkości” Set wewnątrz klasy Arrays . Dlaczego tego chcesz? A Set gwarantuje, że nie ma duplikatów, ale jeśli piszesz je ręcznie, nie powinieneś potrzebować tej funkcji ... i List ma więcej metod. Oba interfejsy rozszerzają się o Collection i Iterable.


Jak mówili inni, użyj guava Jeśli naprawdę chcesz tej funkcji - ponieważ nie jest w JDK. Spójrz na ich odpowiedzi (w szczególności odpowiedź Michaela Schmeißera), aby uzyskać informacje na ten temat.

+3

To jest najlepsza odpowiedź do tej pory, ponieważ wskazuje, co robi program Arrays.asList(). Wielu twórców wydaje się wierzyć, że Arrays.asList() tworzy java.util.ArrayList, podczas gdy w rzeczywistości tworzy java.util.Arrays $ ArrayList (która jest tylko częściowo zmienna i widok na żywo z podstawowej tablicy) –

+1

ktoś chciałby to zrobić, najczęstszym powodem ręcznego skonstruowania zestawu (lub listy) jest klasa testowa, w której podajesz wartości testowe. –

17

Dla szczególnych przypadków zestawy z zero lub jeden członków, można użyć:

java.util.Collections.EMPTY_SET 

oraz:

java.util.Collections.singleton("A") 
+0

dla tych specjalnych przypadków, jest to prawdopodobnie najlepsze rozwiązanie, ponieważ używa standardowego API java.util – arcuri82

0

Oto mały sposób można użyć

/** 
    * Utility method analogous to {@link java.util.Arrays#asList(Object[])} 
    * 
    * @param ts 
    * @param <T> 
    * @return the set of all the parameters given. 
    */ 
    @SafeVarargs 
    @SuppressWarnings("varargs") 
    public static <T> Set<T> asSet(T... ts) { 
    return new HashSet<>(Arrays.asList(ts)); 
    } 
1

W Javie 9, podobna funkcja została dodana przez metod fabrycznych:

Set<String> oneLinerSet = Set.of("a", "b", ...); 

(Tam są odpowiednikami dla List również.)

Powiązane problemy