Finden Sie doppelte Einträge in der Collection
Gibt es ein tool oder eine Bibliothek zu finden, doppelte Einträge in einer Sammlung nach bestimmten Kriterien, die umgesetzt werden können?
Mich klar: ich will vergleichen die Einträge, die einander nach bestimmten Kriterien. Also ich denke, ein Predicate
Rückkehr nur true
oder false
ist nicht genug.
Kann ich nicht verwenden equals
.
Auf welche Weise möchten Sie geben Sie die Deduplizierung Kriterien? Als ein binäres Prädikat?
Möchten Sie suchen die Duplikate, oder entfernen?
Eigentlich würde es ausreichen, nur um zu wissen, ob es Duplikate sind.
Talk - ah, dann könnten Sie einfach vergleichen Sie die Größe der Kollektion, die aus Samuel Rossille Antwort auf die Größe der ursprünglichen Sammlung.
Bitte siehe meine editierte Frage.
Möchten Sie suchen die Duplikate, oder entfernen?
Eigentlich würde es ausreichen, nur um zu wissen, ob es Duplikate sind.
Talk - ah, dann könnten Sie einfach vergleichen Sie die Größe der Kollektion, die aus Samuel Rossille Antwort auf die Größe der ursprünglichen Sammlung.
Bitte siehe meine editierte Frage.
InformationsquelleAutor | 2012-05-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hängt es von den semantischen Kriterien von:
Wenn Ihr Kriterium ist immer das gleiche für eine bestimmte Klasse, und ist die auf dem zugrunde liegenden Konzept, sollten Sie einfach umsetzen
equals
undhashCode
und verwenden einen Satz.Wenn dein Kriterium ist, hängt vom Kontext ab, org.apache.Unterhaus.Sammlungen.CollectionUtils.wählen Sie java.util.Sammlung, org.apache.Unterhaus.Sammlungen.Prädikat) könnte die richtige Lösung für Sie.
InformationsquelleAutor Samuel Rossille
Wenn Sie wollen finden Duplikate, anstatt nur Sie zu entfernen, ein Ansatz wäre, zu werfen, die Sammlung in ein array, Sortieren Sie das array über einen Komparator realisiert, dass Ihre Kriterien, dann Linear Spaziergang durch das array, auf der Suche nach adjacent duplicates.
Hier ist eine Skizze (nicht getestet):
Edit: Von Ihrem Kommentar, Sie wollen einfach nur wissen, ob es sind Duplikate. Der Ansatz oben funktioniert dies auch. Aber Sie könnte einfach erstellen Sie einfach eine java.util.SortedSet mit einem benutzerdefinierten Komparator. Hier ist eine Skizze:
InformationsquelleAutor Andy Thomas
Können Sie sich eine Java-Satz, um die Suche nach Duplikaten zwischen Objekten eines beliebigen Typs: wickeln Sie Ihre Ziel-Klasse in einem eigenen wrapper, wertet der Geschlechter, basierend auf Ihren Kriterien aus und erstellen Sie eine Reihe von Wrapper.
Hier wird einem etwas längeren Beispiel, das veranschaulicht die Technik. Es hält zwei Menschen mit dem gleichen Vornamen gleichberechtigt zu sein, und so erkennt er, drei Duplikate in array fünf Objekte.
Spielen kann man mit diesem Beispiel auf ideone [link].
Wenn Ihre hash-Funktion ist gut, die Effizienz ist die gleiche wie bei jedem hash-Tabelle, die
O(1)
für jedes Element, oderO(N)
für die gesamte Kollektion.dasblinkenlight: ich bin ein bisschen besorgt über die wrap-Objekt erstellen, obwohl ich weiß, dass Sie gegangen werden außerhalb der Schleife.
Java ist sehr effizient bei der Erstellung von kleinen Objekten (und diese Objekte sind winzig). Leider ist Java nicht ein Konzept haben, parallel .NET die Gleichberechtigung der comparer -, die erlauben würde, für eine Lösung, die verhindert, dass temporäre Objekte insgesamt.
InformationsquelleAutor dasblinkenlight
Könnte man eine Karte und während der Iteration über die Sammlung legen Sie die Elemente in die Karte (die Prädikate würde den Schlüssel bilden) und ob es bereits einen Eintrag, den Sie gefunden haben, ein Duplikat.
Weitere Informationen finden Sie hier: Finden Duplikate in einer Sammlung
InformationsquelleAutor Thomas
Ich habe eine neue Benutzeroberfläche ähnlich der
, IEqualityComparer<T>
Schnittstelle in .NET.Solche
EqualityComparator<T>
ich dann übergeben Sie die folgende Methode, die erkennt Duplikate.Diese Weise kann ich mich anpassen, den Vergleich zu meinen Bedürfnissen.
InformationsquelleAutor
Treeset können Sie dies leicht tun:
yourComarator
ist beim AufrufuniqueItems.add(o)
fügt das Element, auf das set und zurücktrue
wenn die Sache eindeutig ist. Wenn der Komparator hält das Objekt zu duplizieren, zuadd(o)
false zurück.Beachten Sie, dass das Element
equals
Methode muss im Einklang mityourComarator
als pro der TreeSet-Dokumentation für diese zu arbeiten.InformationsquelleAutor Tadhg
Durchlaufen der
ArrayList
die Duplikate enthält, und fügen Sie Sie derHashSet
. Wenn Sie die add-Methode gibt false zurück, in derHashSet
melden Sie sich einfach das doppelte der Konsole.equals()
. EinHashSet
verwendethashCode()
undequals()
. Daher kann er nicht verwenden Sie eineHashSet
.InformationsquelleAutor Nagendra