Schnittmenge und Vereinigung von ArrayLists in Java
Gibt es irgendwelche Methoden, dies zu tun? Ich war auf der Suche, konnte aber nichts finden.
Andere Frage: ich brauche diese Methoden, so kann ich Dateien filtern.
Einige sind AND
Filter und einige sind OR
Filter (wie in der Mengenlehre), so muss ich einen filter nach alle Dateien und den vereinen/schneidet ArrayLists, besitzt diese Dateien.
Sollte ich eine andere Datenstruktur für die Dateien? Gibt es sonst noch etwas, dass wäre eine bessere Laufzeit?
InformationsquelleAutor der Frage yotamoo | 2011-03-12
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine schlichte Umsetzung ohne Verwendung jeglicher third-party Bibliothek. Hauptvorteil gegenüber
retainAll
removeAll
undaddAll
ist, dass diese Methoden nicht ändern den ursprünglichen Listen-input, um die Methoden.InformationsquelleAutor der Antwort adarshr
Sammlung (also ArrayList auch) haben:
Verwenden Sie eine List-Implementierung, wenn Sie akzeptieren, Wiederholungen, ein Satz-Implementierung, wenn Sie nicht:
InformationsquelleAutor der Antwort smas
Dieser Beitrag ist ziemlich alt, aber dennoch war es das erste aufspringen auf google bei der Suche zum Thema.
Möchte ich ein update mit Java 8 streams zu tun (im Grunde) die gleiche Sache in einer einzigen Zeile:
Wenn jemand eine bessere/schnellere Lösung lassen Sie mich wissen, aber diese Lösung ist ein schöner one-liner können werden leicht in eine Methode ohne eine unnötige Hilfsklasse/- Methode und immer noch halten die Lesbarkeit.
InformationsquelleAutor der Antwort Fat_FS
union
removeAll
und dannaddAll
.Finden Sie mehr in der Dokumentation collection(ArrayList ist eine collection)
http://download.oracle.com/javase/1.5.0/docs/api/java/util/Collection.html
InformationsquelleAutor der Antwort The GiG
Gewerkschaften und Kreuzungen definiert nur für Gruppen, keine Listen. Wie Sie bereits erwähnt.
Überprüfen Guave Bibliothek für Filter. Auch guava bietet Echtzeit Kreuzungen und Gewerkschaften
InformationsquelleAutor der Antwort Stan Kurilin
Können Sie
CollectionUtils
aus apache commons.InformationsquelleAutor der Antwort bluefoot
Die Lösung markiert, ist nicht effizient. Es hat ein O(n^2) Zeit-Komplexität. Was wir tun können, ist das Sortieren der beiden Listen, und das ausführen einer Kreuzung Algorithmus, wie der unten.
Dieser hat eine Komplexität von O(n log n + n) ist in O(n log n).
Die union ist in einer ähnlichen Art und Weise. Nur sicherstellen, dass Sie die geeigneten änderungen an der if-elseif-else-Anweisungen.
Können Sie auch verwenden, Iteratoren, wenn Sie wollen (ich weiß, Sie sind effizienter in C++, ich weiß nicht, ob dies wahr ist in Java auch).
InformationsquelleAutor der Antwort AJed
Ich glaube, Sie sollten ein
Set
zu halten, die Dateien, wenn Sie wollen, zu tun, intersection und union auf. Dann können Sie Guave's Setzt Klasse zu tununion
intersection
und Filterung durch einePredicate
als gut. Der Unterschied zwischen diesen Methoden und der anderen Vorschläge ist, dass alle diese Methoden erzeugen faul Ansichten der Vereinigung, Schnitt, etc. von den beiden sets. Apache Commons erstellt eine neue Sammlung und die Daten kopiert.retainAll
änderungen einer Ihrer Sammlungen durch das entfernen von Elementen aus.InformationsquelleAutor der Antwort ColinD
Hier ist ein Weg, wie Sie tun können, eine Kreuzung mit streams (denken Sie daran, dass Sie auf java 8 streams):
Beispiel für Listen mit verschiedenen Typen. Wenn Sie eine realtion zwischen foo und bar und Sie können sich ein bar-Objekt von foo als können Sie ändern Ihre stream:
InformationsquelleAutor der Antwort Deutro
Fand ich ListUtils sehr nützlich für diesen Anwendungsfall.
Verwenden ListUtils von org.apache.Unterhaus.Sammlungen, wenn Sie nicht wollen, zu ändern vorhandener Liste.
ListUtils.intersection(list1, list2)
InformationsquelleAutor der Antwort Bala
In Java 8, ich verwende einfache Hilfsmethoden wie diese:
InformationsquelleAutor der Antwort Pascalius
Arbeitete ich auch auf die ähnliche situation und erreicht hier auf der Suche nach Hilfe. Schließlich finden meine eigene Lösung für Arrays.
ArrayList AbsentDates = new ArrayList(); //Speichern Array1-Array2
Hinweis : dieses Posting, wenn es kann jemand helfen erreichen Sie diese Seite für Hilfe.
InformationsquelleAutor der Antwort Shubham Pandey
Können Sie commons-collections4 CollectionUtils
InformationsquelleAutor der Antwort xxg
Wenn die Objekte in der Liste sind hashable (D. H. Sie haben eine anständige hashCode-und equals-Funktion), der Schnellste Ansatz zwischen Tabellen ca. Größe > 20 ist die Errichtung einer HashSet für die größere der beiden Listen.
InformationsquelleAutor der Antwort Jeroen Vuurens
Endlösung:
InformationsquelleAutor der Antwort Choletski
Erstmal, ich bin das kopieren aller Werte des arrays zu einem einzigen array, dann bin ich für das entfernen von Duplikaten Werte in das array. Zeile 12 zu erklären, wenn dieselbe Zahl auftreten mehr als die Zeit, dann setzen einige zusätzlichen Müll Wert in "j" position. Am Ende queren von start-und-Ende und kontrollieren Sie, ob gleiche Müll Wert auftreten, dann verwerfen.
InformationsquelleAutor der Antwort Ashutosh
Wenn Sie Ihre Daten in Gruppen, die Sie nutzen könnten Guave ist
Legt fest
Klasse.InformationsquelleAutor der Antwort Neil
Wenn die Nummer mit als ich Sie es das auftreten oder erstmals nicht mit Hilfe von "indexOf ()", wenn die Zahl übereinstimmt ersten mal, dann drucken und speichern in einen string so, dass, wenn Sie das nächste mal dieselbe Zahl übereinstimmt, dann ist es nicht drucken, weil er aufgrund von "indexOf ()" - Bedingung wird false.
}
InformationsquelleAutor der Antwort Ashutosh