Ich möchte ein Array in ein Set in Java konvertieren. Es gibt einige offensichtliche Möglichkeiten, dies zu tun (dh mit einer Schleife), aber ich möchte etwas etwas ordentlicheres, etwas wie:
java.util.Arrays.asList(Object[] a);
Irgendwelche Ideen?
java
collections
arrays
set
Bob Gilmore
quelle
quelle
Arrays.asList
ist O (1).Das ist Collections.addAll (java.util.Collection, T ...) aus JDK 6.
Zusätzlich: Was ist, wenn unser Array voller Grundelemente ist?
Für JDK <8 würde ich nur die offensichtliche
for
Schleife schreiben , um den Wrap und das Add-to-Set in einem Durchgang durchzuführen.Für JDK> = 8 ist eine attraktive Option wie folgt:
quelle
java.util.Collections.addAll
. Außerdem würde ich Commons Collections nicht mehr empfehlen, da es nicht generiert wird und Guava existiert.addAll
wird O ( n ) sein.Mit Guava können Sie Folgendes tun:
quelle
new HashSet<T>(Arrays.asList(someArray))
. Siehe google.github.io/guava/releases/19.0/api/docs/com/google/common/…Java 8:
quelle
Varargs wird auch funktionieren!
quelle
Java 8
Wir haben die Möglichkeit,
Stream
auch zu verwenden. Wir können Streams auf verschiedene Arten erhalten:Der Quellcode von
Collectors.toSet()
zeigt, dass ElementeHashSet
einzeln zu einem hinzugefügt werden , die Spezifikation jedoch nicht garantiert, dass es sich um ein Element handeltHashSet
.Daher ist es besser, die spätere Option zu verwenden. Die Ausgabe ist:
[A, B, C, D] [A, B, C, D] [A, B, C, D]
Unveränderliches Set (Java 9)
In Java 9 wurde die
Set.of
statische Factory-Methode eingeführt, die unveränderliche Mengen für die bereitgestellten Elemente oder das Array zurückgibt.Weitere Informationen finden Sie unter Statische Factory-Methoden für unveränderliche Sets .
Unveränderliches Set (Java 10)
Wir können ein unveränderliches Set auch auf zwei Arten erhalten:
Set.copyOf(Arrays.asList(array))
Arrays.stream(array).collect(Collectors.toUnmodifiableList());
Die Methode verwendet
Collectors.toUnmodifiableList()
intern dieSet.of
in Java 9 eingeführte Methode . Weitere Informationen finden Sie auch in meiner Antwort .quelle
Stream.of()
- das wusste ich nicht. Ein kleines ProblemCollectors.toSet()
: Sie sagen, die Spezifikation garantiert nicht das Hinzufügen von Elementen nacheinander, aber das ist es, was es bedeutet: "sammelt sich ... in einem neuenSet
". Und es ist besser lesbar - meiner Meinung nach vorzuziehen, wenn Sie nicht die Garantien für konkreten Typ, Veränderbarkeit, Serialisierbarkeit und Thread-Sicherheit benötigen.HashSet
. Es garantiert nur, dass es ein sein wirdSet
und das meine ich. Hoffe ich habe es geklärt.Nachdem Sie dies getan haben
Arrays.asList(array)
, können Sie ausführenSet set = new HashSet(list);
Hier ist eine Beispielmethode, die Sie schreiben können:
quelle
In Eclipse-Sammlungen funktioniert Folgendes:
Hinweis: Ich bin ein Committer für Eclipse-Sammlungen
quelle
Schnell: Sie können tun:
und umzukehren
quelle
Ich habe das Folgende aus dem Rat oben geschrieben - stiehl es ... es ist schön!
quelle
Es hat schon viele gute Antworten, aber die meisten von ihnen werden nicht mit Array von Primitiven arbeiten (wie
int[]
,long[]
,char[]
,byte[]
, etc.)In Java 8 und höher können Sie das Array mit folgenden Elementen versehen:
Dann konvertieren, um mit Stream zu setzen:
quelle
Manchmal hilft die Verwendung einiger Standardbibliotheken sehr. Versuchen Sie, sich die Apache Commons-Sammlungen anzusehen . In diesem Fall werden Ihre Probleme einfach in so etwas umgewandelt
Und hier ist das CollectionsUtils javadoc
quelle
java.util.Collections.addAll(myEmptySet, keys);
?Verwenden Sie
CollectionUtils
oderArrayUtils
vonstanford-postagger-3.0.jar
quelle
In Java 10 :
Set.copyOf
Gibt eine nicht modifizierbare Datei zurück,Set
die die Elemente der angegebenen enthältCollection
.Das Gegebene
Collection
darf nicht seinnull
und darf keinenull
Elemente enthalten .quelle
die Ausgabe ist
ändere es auf
die Ausgabe ist
quelle
Für alle, die nach Android suchen:
Kotlin-Sammlungslösung
Das Sternchen
*
ist derspread
Operator. Es wendet alle Elemente in einer Sammlung einzeln an, die jeweils an einenvararg
Methodenparameter übergeben werden. Es ist äquivalent zu:Das Übergeben keiner Parameter
setOf()
führt zu einem leeren Satz.Darüber hinaus
setOf
können Sie eine dieser Optionen auch für einen bestimmten Hash-Typ verwenden:So definieren Sie den Sammlungselementtyp explizit.
quelle
new HashSet<Object>(Arrays.asList(Object[] a));
Aber ich denke, das wäre effizienter:
quelle
HashSet
beispielsweise auf der Grundlage der Größe des Arrays festgelegt.quelle