Wie kann ich feststellen (true / false zurückgeben), ob eine ArrayList mehr als ein Element in Java enthält?
Vielen Dank, Terry
Bearbeiten Vergessen, um zu erwähnen, dass ich nicht "Blöcke" miteinander vergleichen möchte, sondern deren ganzzahlige Werte. Jeder "Block" hat ein int und das macht sie anders. Ich finde das int eines bestimmten Blocks, indem ich eine Methode namens "getNum" aufrufe (z. B. table1 [0] [2] .getNum ();
Antworten:
Am einfachsten: Speichern Sie die gesamte Sammlung in einem Set (mithilfe des Set-Konstruktors (Collection) oder von Set.addAll) und prüfen Sie, ob das Set dieselbe Größe wie die ArrayList hat.
Update: Wenn ich Ihre Frage richtig verstehe, haben Sie ein 2D-Array von Block, wie in
Blocktabelle [] [];
und Sie möchten feststellen, ob eine Reihe von ihnen Duplikate enthält?
In diesem Fall könnte ich Folgendes tun, vorausgesetzt, Block implementiert "equals" und "hashCode" korrekt:
Ich bin mir der Syntax nicht 100% sicher, daher ist es möglicherweise sicherer, sie als zu schreiben
Set.add
Gibt einen booleschen Wert false zurück, wenn sich das hinzugefügte Element bereits im Satz befindet. Sie können also sogar einen Kurzschluss kurzschließen und einen Fehler beheben, der zurückgegeben wird,false
wenn Sie nur wissen möchten, ob Duplikate vorhanden sind.quelle
Verbesserter Code, der den Rückgabewert von verwendet,
Set#add
anstatt die Größe der Liste und des Satzes zu vergleichen.quelle
Set<T> set = new HashSet<T>(list.size());
? Angesichts eines Listenparameters halte ich es für effizienter, wenn die Liste häufig keine Duplikate enthält.HashSet
die Größenanpassung auf die Größe der Liste führt aufgrund des zugrunde liegenden Ladefaktors der Hash-Struktur zu einer Größenänderung beim Durchlaufen der gesamten Liste.Wenn Sie Duplikate vermeiden möchten, sollten Sie nur den mittleren Prozess zum Erkennen von Duplikaten ausschließen und ein Set verwenden .
quelle
Verbesserter Code zur Rückgabe der doppelten Elemente
quelle
Wenn Ihre Elemente irgendwie vergleichbar sind (die Tatsache, dass die Reihenfolge eine echte Bedeutung hat, ist gleichgültig - sie muss nur mit Ihrer Definition der Gleichheit übereinstimmen), sortiert die schnellste Lösung zum Entfernen von Duplikaten die Liste (0 (n log ()))))))) n))), um dann einen einzelnen Durchgang durchzuführen und nach wiederholten Elementen zu suchen (dh nach gleichen Elementen, die aufeinander folgen) (dies ist O (n)).
Die Gesamtkomplexität wird O (n log (n)) sein, was ungefähr dem entspricht, was Sie mit einem Set (n-mal lang (n)) erhalten würden, jedoch mit einer viel kleineren Konstante. Dies liegt daran, dass die Konstante in sort / dedup aus den Kosten für den Vergleich von Elementen resultiert, während die Kosten aus der Menge höchstwahrscheinlich aus einer Hash-Berechnung plus einem (möglicherweise mehreren) Hash-Vergleich resultieren. Wenn Sie eine Hash-basierte Set-Implementierung verwenden, bedeutet dies, dass eine Tree-basierte Implementierung ein O (n log² (n)) ergibt, was noch schlimmer ist.
Nach meinem Verständnis müssen Sie jedoch keine Duplikate entfernen , sondern lediglich ihre Existenz testen. Sie sollten also einen Zusammenführungs- oder Heap-Sortieralgorithmus in Ihrem Array von Hand codieren, der einfach die Rückgabe von true beendet (dh "es gibt ein Dup"), wenn Ihr Komparator 0 zurückgibt, andernfalls die Sortierung abschließt und den sortierten Array-Test auf Wiederholungen durchläuft . Bei einer Zusammenführungs- oder Heap-Sortierung haben Sie tatsächlich nach Abschluss der Sortierung jedes doppelte Paar verglichen, es sei denn, beide Elemente befanden sich bereits an ihrer endgültigen Position (was unwahrscheinlich ist). Daher sollte ein optimierter Sortieralgorithmus eine enorme Leistungsverbesserung bringen (das müsste ich beweisen, aber ich denke, der optimierte Algorithmus sollte bei einheitlich zufälligen Daten im O (log (n)) sein).
quelle
Ich musste eine ähnliche Operation für a durchführen
Stream
, konnte aber kein gutes Beispiel finden. Folgendes habe ich mir ausgedacht.Dies hat den Vorteil eines Kurzschlusses, wenn Duplikate frühzeitig gefunden werden, anstatt den gesamten Stream verarbeiten zu müssen, und ist nicht viel komplizierter, als einfach alles in einen zu setzen
Set
und die Größe zu überprüfen. Dieser Fall wäre also ungefähr:quelle
Mit Java 8+ können Sie die Stream-API verwenden:
quelle
Einfach ausgedrückt: 1) Stellen Sie sicher, dass alle Elemente vergleichbar sind. 2) Sortieren Sie das Array. 2) Durchlaufen Sie das Array und suchen Sie nach Duplikaten
quelle
Um die Duplikate in einer Liste zu kennen, verwenden Sie den folgenden Code: Sie erhalten den Satz, der Duplikate enthält.
quelle
Der beste Weg, um dieses Problem zu lösen, ist die Verwendung eines HashSet :
Drucken Sie einfach die Ergebnis- Arrayliste aus und sehen Sie das Ergebnis ohne Duplikate :)
quelle
Wenn Sie doppelte Werte wünschen:
Und denken Sie wahrscheinlich auch daran, Werte zu kürzen oder Kleinbuchstaben zu verwenden ... je nach Fall.
quelle
Hinweis: Dies hat jedoch erhebliche Leistungseinbußen zur Folge, da Elemente vom Anfang der Liste entfernt werden. Um dies zu beheben, haben wir zwei Möglichkeiten. 1) in umgekehrter Reihenfolge iterieren und Elemente entfernen. 2) Verwenden Sie LinkedList anstelle von ArrayList. Aufgrund voreingenommener Fragen, die in Interviews gestellt wurden, um Duplikate aus der Liste zu entfernen, ohne eine andere Sammlung zu verwenden, ist das obige Beispiel die Antwort. In der realen Welt werde ich, wenn ich dies erreichen muss, einfach Elemente von List zu Set setzen!
quelle
Ein Beispiel für eine konkrete Klasse, die überschrieben wurde
equals()
:quelle
quelle
Diese Antwort ist in Kotlin geschrieben, kann aber leicht nach Java übersetzt werden.
Wenn die Größe Ihrer Arrayliste in einem festgelegten kleinen Bereich liegt, ist dies eine großartige Lösung.
quelle
quelle