563 Stimmen

Wie kann ich wiederholte Elemente aus ArrayList entfernen?

Ich habe eine ArrayList<String> und ich möchte wiederholte Zeichenfolgen daraus entfernen. Wie kann ich das tun?

1080voto

jonathan-stafford Punkte 11347

Wenn Sie keine Duplikate in einer Collection sollten Sie überlegen, warum Sie eine Collection die Duplikate zulässt. Der einfachste Weg, wiederholte Elemente zu entfernen, ist das Hinzufügen des Inhalts zu einer Set (die keine Duplikate zulässt) und fügen Sie dann die Set zurück zum ArrayList :

Set<String> set = new HashSet<>(yourList);
yourList.clear();
yourList.addAll(set);

Dadurch wird natürlich die Reihenfolge der Elemente in der ArrayList .

312voto

abahgat Punkte 13012

Obwohl die Umwandlung der ArrayList を、その HashSet entfernt effektiv Duplikate. Wenn Sie die Einfügereihenfolge beibehalten müssen, würde ich Ihnen eher diese Variante empfehlen

// list is some List of Strings
Set<String> s = new LinkedHashSet<>(list);

Wenn Sie dann wieder eine List Referenz, können Sie wieder den Konvertierungskonstruktor verwenden.

166voto

Vitalii Fedorenko Punkte 103468

In Java 8:

List<String> deduped = list.stream().distinct().collect(Collectors.toList());

Bitte beachten Sie, dass die hashCode-gleich Vertrag für Listenmitglieder sollte eingehalten werden, damit die Filterung richtig funktioniert.

71voto

akhil_mittal Punkte 20953

Angenommen, wir haben eine Liste von String mögen:

List<String> strList = new ArrayList<>(5);
// insert up to five items to list.        

Dann können wir doppelte Elemente auf verschiedene Weise entfernen.

Vor Java 8

List<String> deDupStringList = new ArrayList<>(new HashSet<>(strList));

Anmerkung: Wenn wir die Einfügereihenfolge beibehalten wollen, müssen wir Folgendes verwenden LinkedHashSet anstelle von HashSet

Guave verwenden

List<String> deDupStringList2 = Lists.newArrayList(Sets.newHashSet(strList));

Java 8 verwenden

List<String> deDupStringList3 = strList.stream().distinct().collect(Collectors.toList());

Anmerkung: Für den Fall, dass wir das Ergebnis in einer spezifische Umsetzung der Liste たとえば LinkedList dann können wir das obige Beispiel wie folgt abändern:

List<String> deDupStringList3 = strList.stream().distinct()
                 .collect(Collectors.toCollection(LinkedList::new));

Wir können verwenden parallelStream auch im obigen Code, aber es kann nicht die erwarteten Leistungsvorteile bringen. Prüfen Sie dies Frage für mehr.

53voto

Benno Richters Punkte 14998

Wenn Sie keine Duplikate wünschen, verwenden Sie eine Satz anstelle einer List . Zum Konvertieren einer List を、その Set können Sie den folgenden Code verwenden:

// list is some List of Strings
Set<String> s = new HashSet<String>(list);

Wenn es wirklich notwendig ist, können Sie die gleiche Konstruktion verwenden, um eine Set zurück in eine List .

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