2013-05-03 11 views
62

Ich suche nach einer sehr einfachen Möglichkeit, ein Set zu erstellen.Ist .asSet (...) in einer beliebigen API vorhanden?

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

Gibt es etwas ähnliches für Set?

+0

möglich Duplikat von [Java - leicht zu konvertieren Array zu setzen] (http://stackoverflow.com/questions/3064423/java-easily-convert-array-to-set) –

+1

ist es nicht, creatin g a Setzen und Konvertieren eines Arrays in ein Set ist nicht das Gleiche – cahen

Antwort

19

Jetzt mit Java 8 Sie dies ohne die Notwendigkeit von Drittanbietern tun Rahmen:

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

Siehe Collectors.

Viel Spaß!

+1

Heutzutage mit Java 8 ist dies wahrscheinlich die beste Antwort, weil es nicht von 3rd-Party-Bibliotheken abhängt und leicht an andere Sammlung angepasst werden kann Typen, also setze ich dies als akzeptiert ein. Vielen Dank an alle für die anderen großartigen Lösungen. (Übrigens, dieses Set ist änderbar) – cahen

+0

Nun, wer hat gesagt, dass Java zu ausführlich war? Das ist natürlich die beste Antwort! – BobDoolittle

+0

Vielen Dank @BobDoolittle! –

36

Sie

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

Nein verwenden könnte, aber Sie können es tun, wie diese

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

Mit Guava ist es so einfach wie das:

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

Oder für eine veränderbare Satz:

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

Weitere Datentypen finden Sie in der Guava user guide

+0

Gibt es eine nicht unveränderliche Version davon? – cahen

+3

@cohen ja: 'Sets.newHashSet (" a "," b ")' oder 'Sets.newLinkedHashSet (" a "," b ")' –

+1

Ich habe der Antwort eine änderbare Variante hinzugefügt. –

14

Wie andere gesagt haben, nutzen könnten, zu verwenden:

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

Der Grund dies tut nicht existieren in Java ist, dass Arrays.asList kehrt eine feste Größe Liste, mit anderen Worten:

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

Returns:

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

Es gibt keine JDK Implementierung einer "festen Größe" Set innerhalb der Arrays Klasse . Warum willst du das? A Set garantiert, dass es keine Duplikate gibt, aber wenn Sie sie manuell eingeben, sollten Sie diese Funktionalität nicht benötigen ... und List hat mehr Methoden. Beide Schnittstellen erweitern Collection und Iterable.


Wie schon andere gesagt haben, verwenden guava Wenn Sie wirklich diese Funktionalität wollen - da es nicht in der JDK ist. Sehen Sie sich ihre Antworten an (insbesondere Michael Schmeißers Antwort), um Informationen dazu zu erhalten.

+3

gehört. Dies ist die beste Antwort bisher, weil es darauf hinweist, was Arrays.asList() tatsächlich tut. Viele Entwickler scheinen zu glauben, dass Arrays.asList() eine java.util.ArrayList erstellt, während sie tatsächlich eine java.util.Arrays $ ArrayList erstellt (die nur teilweise veränderbar ist und eine Live-Ansicht des zugrunde liegenden Arrays). –

+1

Warum? jemand möchte dies tun, der häufigste Grund, ein Set (oder eine Liste) von Hand zu konstruieren, ist in einer Testklasse, in der Sie Testwerte übergeben. –

17

Für die besondere Fälle von Sätzen mit null oder eins Mitgliedern, können Sie verwenden:

java.util.Collections.EMPTY_SET 

und:

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

für diese speziellen Fälle, ist es wahrscheinlich die beste Lösung, da es den Standard java.util API verwendet – arcuri82

0

Hier ist eine kleine Methode Sie

/** 
    * 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

In Java 9 ähnliche Funktion über Factory-Methoden hinzugefügt wurde verwenden können:

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

(Es gibt Mittel für List als auch.)

Verwandte Themen