787 Stimmen

Der einfachste Weg, eine Liste in eine Menge in Java zu konvertieren

Wie konvertiert man am einfachsten eine List zu einer Set in Java?

1264voto

sepp2k Punkte 352762
Set<Foo> foo = new HashSet<Foo>(myList);

4 Stimmen

Auch wenn diese Antwort richtig ist, so fehlt ihr doch ein ausreichender technischer Kontext, um als beste/akzeptierte Antwort zu gelten, denn es gibt hier Fallstricke, je nachdem, welche Implementierungen von Set y Map man verwendet; HashSet es angenommen hier.

4 Stimmen

@Madbreaks Kam speziell wegen dieses Problems hierher und würde die Lösung von Ramesh mit der Erklärung von Abdul allen anderen empfehlen, die daran interessiert sind, dies zu tun

167voto

Spina Punkte 8706

Ich stimme sepp2k zu, aber es gibt noch einige andere Details, die wichtig sein könnten:

new HashSet<Foo>(myList);

erhalten Sie eine unsortierte Menge, die keine Duplikate enthält. In diesem Fall wird die Duplizierung mit der Methode .equals() an Ihren Objekten erkannt. Dies geschieht in Kombination mit der Methode .hashCode(). (Für mehr über Gleichheit siehe ici )

Eine Alternative, die eine sortierte Menge ergibt, ist:

new TreeSet<Foo>(myList);

Dies funktioniert, wenn Foo Comparable implementiert. Wenn dies nicht der Fall ist, sollten Sie einen Komparator verwenden:

Set<Foo> lSet = new TreeSet<Foo>(someComparator);
lSet.addAll(myList);

Dies hängt entweder von compareTo() (aus der Vergleichsschnittstelle) oder compare() (aus dem Komparator) ab, um die Eindeutigkeit zu gewährleisten. Wenn Sie sich also nur für die Eindeutigkeit interessieren, verwenden Sie das HashSet. Wenn es Ihnen um die Sortierung geht, sollten Sie das TreeSet verwenden. (Denken Sie daran: Optimieren Sie später!) Wenn es auf Zeiteffizienz ankommt, verwenden Sie ein HashSet, wenn es auf Raumeffizienz ankommt, sehen Sie sich TreeSet an. Beachten Sie, dass effizientere Implementierungen von Set und Map über Trove (und andere Quellen) verfügbar sind.

0 Stimmen

Vielen Dank für die Aufnahme des benutzerdefinierten Anwendungsfalls Comparator!

89voto

Ramesh Papaganti Punkte 6531

Java - addAll

set.addAll(aList);

Java - neues Objekt

new HashSet(list)

Java-8

list.stream().collect(Collectors.toSet());

Guva verwenden

 Sets.newHashSet(list)

Apache Commons

CollectionUtils.addAll(targetSet, sourceList);

Java 10

var set = Set.copyOf(list);

3 Stimmen

Gibt es irgendwelche Leistungsunterschiede zwischen ihnen?

1 Stimmen

Ich denke, diese Antwort sollte als beste Antwort markiert werden. Danke!

75voto

Vitalii Fedorenko Punkte 103468

Wenn Sie die Guave Bibliothek:

Set<Foo> set = Sets.newHashSet(list);

oder besser:

Set<Foo> set = ImmutableSet.copyOf(list);

4 Stimmen

Warum ist ImmutableSet.copyOf besser?

3 Stimmen

Welche Vorteile hat newHashSet() von Guava gegenüber dem einfachen Java new HashSet()?

0 Stimmen

@Nelda.techspiress Die javadoc erörtert, wann die Methode angewendet werden sollte und wann nicht. Beachten Sie den letzten Teil: diese Methode ist nicht sehr nützlich und wird wahrscheinlich in Zukunft veraltet sein. Allerdings bin ich ein wenig überrascht, dass die Konsistenz nicht als Faktor genannt wird, wie es bei [ImmutableSet.of()](http://google.github.io/guava/releases/14.0/api/docs/com/google/common/collect/ImmutableSet.html#of()) zum Beispiel. EDIT: es kann nicht Faktor sein, weil tous die Überlastungen sind unnötig.

36voto

JimB Punkte 1093

Mit Java 8 können Sie stream verwenden:

List<Integer> mylist = Arrays.asList(100, 101, 102);
Set<Integer> myset = mylist.stream().collect(Collectors.toSet()));

20 Stimmen

Haben Sie die Leistung Strafe auf diese überprüft? Dies würde eine Iterable + Iterator, eine neue HashSet(), und dann für jedes Listenelement, ein addAll() Aufruf auf den neuen Satz zu tun. Insgesamt werden ca. 5 Objekte für etwas so Einfaches wie ein neues HashSet(list) erstellt.

2 Stimmen

@AgostonHorvath Vielen Dank für Ihren Kommentar. Ich war ursprünglich auf der Suche nach dieser Information, als ich hierher kam.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X