Ich habe eine ArrayList<String>
und ich möchte wiederholte Zeichenfolgen daraus entfernen. Wie kann ich das tun?
Antworten
Zu viele Anzeigen?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
.
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.
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.
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.
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
.
- See previous answers
- Weitere Antworten anzeigen