Ich habe eine ArrayList<String>
, und ich möchte wiederholte Zeichenfolgen daraus entfernen. Wie kann ich das machen?
java
list
collections
arraylist
duplicates
user25778
quelle
quelle
public Set<Object> findDuplicates(List<Object> list) { Set<Object> items = new HashSet<Object>(); Set<Object> duplicates = new HashSet<Object>(); for (Object item : list) { if (items.contains(item)) { duplicates.add(item); } else { items.add(item); } } return duplicates; }
List
undSet
(anstelle der ImplementierungstypenArrayList
undHashSet
wie in Ihrem Beispiel) zu definieren.new HashSet(al)
anstatt es zu leeren und aufzurufenaddAll
.Object
Wert mehrere Werte hat, wenn sich zwei davon wiederholen, betrachte ich sie als doppelt (andere Werte können unterschiedlich sein) und verwendeSet
?Wenn Sie die Einfügereihenfolge beibehalten möchten, sollten Sie diese Variante verwenden, obwohl beim Konvertieren
ArrayList
in eineHashSet
Duplikate effektiv entfernt werdenWenn Sie dann eine
List
Referenz zurückerhalten müssen , können Sie den Konvertierungskonstruktor erneut verwenden.quelle
In Java 8:
Bitte beachten Sie, dass der hashCode-equals- Vertrag für Listenmitglieder eingehalten werden sollte, damit die Filterung ordnungsgemäß funktioniert.
quelle
addAll
zunew TreeSet<String>(String.CASE_INSENSITIVE_ORDER)
. Das erste hinzugefügte Element bleibt im Set. Wenn Ihre Liste "Hund" und "Hund" (in dieser Reihenfolge) enthält, enthält die ListeTreeSet
"Hund". Wenn die Reihenfolge erhalten bleiben muss, dann vor der Zeile in der Antwort setzenlist.replaceAll(String::toUpperCase);
.Angenommen, wir haben eine Liste von
String
wie:Dann können wir doppelte Elemente auf verschiedene Arten entfernen.
Vor Java 8
Hinweis: Wenn wir die Einfügereihenfolge beibehalten möchten, müssen wir
LinkedHashSet
anstelle von verwendenHashSet
Guave benutzen
Verwenden von Java 8
Hinweis: Wenn wir das Ergebnis in einer bestimmten Listenimplementierung erfassen möchten, z. B.
LinkedList
können wir das obige Beispiel wie folgt ändern:Wir können
parallelStream
den obigen Code auch verwenden, er bietet jedoch möglicherweise keine erwarteten Leistungsvorteile. Überprüfen Sie diese Frage für mehr.quelle
parallel streams
immer eine bessere Leistung bringen wird. Aber es ist ein Mythos. Ich habe später erfahren, dass es bestimmte Szenarien gibt, in denen parallele Streams verwendet werden sollten. In diesem Szenario bieten parallele Streams keine bessere Leistung. und ja, parallele Streams liefern in einigen Fällen möglicherweise nicht die gewünschten Ergebnisse.List<String> deDupStringList3 = stringList.stream().map(String::toLowerCase).distinct().collect(Collectors.toList());
sollte in diesem Fall die geeignete Lösung seinWenn Sie keine Duplikate möchten, verwenden Sie ein Set anstelle von a
List
. Um aList
in a umzuwandeln ,Set
können Sie den folgenden Code verwenden:Wenn es wirklich nötig ist, können Sie dieselbe Konstruktion verwenden, um einen
Set
Rücken in einen umzuwandelnList
.quelle
Set
kann hier nicht verwendet werden.Sie können dies auch auf diese Weise tun und die Ordnung bewahren:
quelle
Java 8-Streams bieten eine sehr einfache Möglichkeit, doppelte Elemente aus einer Liste zu entfernen. Mit der eindeutigen Methode. Wenn wir eine Liste von Städten haben und Duplikate aus dieser Liste entfernen möchten, kann dies in einer einzigen Zeile erfolgen -
So entfernen Sie doppelte Elemente aus einer Arrayliste
quelle
Hier ist ein Weg, der Ihre Listenreihenfolge nicht beeinflusst:
l1 ist die ursprüngliche Liste und l2 ist die Liste ohne wiederholte Elemente (Stellen Sie sicher, dass YourClass die Methode equals hat, je nachdem, was Sie für Gleichheit stehen möchten.)
quelle
ArrayList<T>
sollten anstelle von verwendet werdenArrayList
). 2) Das explizite Erstellen von Iteratoren kann durch Verwendung von a vermieden werdenfor (T current : l1) { ... }
. Auch wenn Sie eineIterator
explizit verwenden wollten ,iterador
ist falsch geschrieben.Es ist möglich, Duplikate aus der Arrayliste zu entfernen, ohne HashSet oder eine weitere Arrayliste zu verwenden .
Versuchen Sie diesen Code ..
Ausgabe ist
quelle
ImmutableSet.copyOf(lst).toList()
.indexOf
iteriert dielst
Verwendung einer for-Schleife.Es gibt auch
ImmutableSet
von Guava als Option ( hier ist die Dokumentation):quelle
ImmutableSet.asList()
Methode gibt, die eineImmutableList
zurückgibt, wenn Sie sie als benötigenList
.Dies kann das Problem lösen:
quelle
Wahrscheinlich ein bisschen übertrieben, aber ich mag diese Art von isoliertem Problem. :) :)
Dieser Code verwendet einen temporären Satz (für die Eindeutigkeitsprüfung), entfernt jedoch Elemente direkt in der ursprünglichen Liste. Da das Entfernen von Elementen in einer ArrayList eine große Menge an Array-Kopieren verursachen kann, wird die Methode remove (int) vermieden.
Während wir gerade dabei sind, ist hier eine Version für LinkedList (viel schöner!):
Verwenden Sie die Markierungsschnittstelle, um eine einheitliche Lösung für List zu präsentieren:
EDIT: Ich denke, das Generika-Zeug bringt hier keinen wirklichen Mehrwert. Na ja. :) :)
quelle
quelle
Wenn Sie bereit sind, eine Bibliothek eines Drittanbieters zu verwenden, können Sie die Methode
distinct()
in Eclipse Collections (ehemals GS Collections) verwenden.Der Vorteil der Verwendung
distinct()
anstelle der Konvertierung in eine Menge und dann zurück in eine Liste besteht darin, dassdistinct()
die Reihenfolge der ursprünglichen Liste beibehalten wird und das erste Vorkommen jedes Elements beibehalten wird. Es wird mithilfe eines Sets und einer Liste implementiert.Wenn Sie Ihre ursprüngliche Liste nicht in einen Eclipse-Sammlungstyp konvertieren können, können Sie ListAdapter verwenden, um dieselbe API abzurufen.
Hinweis: Ich bin ein Committer für Eclipse-Sammlungen.
quelle
Diese drei Codezeilen können das duplizierte Element aus ArrayList oder einer beliebigen Sammlung entfernen.
quelle
Verwenden Sie beim Füllen der ArrayList eine Bedingung für jedes Element. Zum Beispiel:
Wir erhalten ein Array {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
quelle
Wenn Sie Ihre Bestellung erhalten möchten, verwenden Sie am besten LinkedHashSet . Wenn Sie diese Liste durch Iterieren an eine Einfügeabfrage übergeben möchten, bleibt die Reihenfolge erhalten.
Versuche dies
Diese Konvertierung ist sehr hilfreich, wenn Sie eine Liste, aber keinen Satz zurückgeben möchten.
quelle
Code:
Hinweis: Auf jeden Fall entsteht Speicheraufwand.
quelle
quelle
LinkedHashSet erledigt den Trick.
// Ausgabe: 5,1,2,3,4
quelle
quelle
Dies wird für Ihre Liste der benutzerdefinierten Objekte verwendet
quelle
Sie können die verschachtelte Schleife wie folgt verwenden:
quelle
Wie bereits erwähnt, sollten Sie anstelle von List eine Klasse verwenden, die die Set-Schnittstelle implementiert, um die Einheitlichkeit der Elemente zu gewährleisten. Wenn Sie die Reihenfolge der Elemente beibehalten müssen, kann die SortedSet-Schnittstelle verwendet werden. Die TreeSet-Klasse implementiert diese Schnittstelle.
quelle
Wenn Sie den Modelltyp List <T> / ArrayList <T> verwenden. Hoffe, es hilft dir.
Hier ist mein Code ohne Verwendung einer anderen Datenstruktur wie Set oder Hashmap
quelle
quelle
quelle
quelle
quelle
Wenn Sie Duplikate aus ArrayList entfernen möchten, finden Sie die folgende Logik:
quelle