Zählen der vorkommen von Elementen in der ArrayList
Ich habe eine java.util.ArrayList<Item>
und ein Item
Objekt.
Nun, ich möchte, um die Anzahl der Zeiten, die Item
gespeichert in arraylist.
Ich weiß, dass ich tun kann arrayList.contains()
überprüfen, aber es wird true zurückgegeben, unabhängig davon, ob es enthält einen oder mehrere Item
s.
Q1. Wie finde ich die Anzahl der Zeit, die das Element gespeichert wird in der Liste?
Q2. Außerdem enthält die Liste mehr als ein Element, wie kann ich bestimmen Sie den index der anderen Elemente da arrayList.indexOf(item)
gibt den index nur den ersten Artikel jeder Zeit?
Tut Element überschreiben von equals und hashcode? Sie brauchen, um.
Warum nicht erweitern Sie die ArrayList-Klasse hinzufügen, die zusätzliche Funktionalität benötigen Sie? Dies ist der Grund, warum OOP existiert 😉 Q1 kann leicht getan werden, indem die Implementierung einen Zähler für jedes einzelne Element in der Liste aus und Inkrementieren Sie jedes mal, wenn ein bereits vorhandenes Element Hinzugefügt wird.
Warum nicht erweitern Sie die ArrayList-Klasse hinzufügen, die zusätzliche Funktionalität benötigen Sie? Dies ist der Grund, warum OOP existiert 😉 Q1 kann leicht getan werden, indem die Implementierung einen Zähler für jedes einzelne Element in der Liste aus und Inkrementieren Sie jedes mal, wenn ein bereits vorhandenes Element Hinzugefügt wird.
InformationsquelleAutor Yatendra Goel | 2010-04-15
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
Collections
Klasse:Wenn Sie brauchen, um count occurencies einer langen Liste viele Male, die ich schlage vor, Sie verwenden eine
HashMap
zum speichern der Zähler und aktualisieren Sie Sie, während Sie das einfügen neuer Elemente in die Liste ein. Dies würde vermeiden, dass die Berechnung jeder Art von Zähler.. aber natürlich werden Sie nicht haben Indizes.Einen entscheidenden Hinweis: Sie können auch andere collections framework (wie Apache-Sammlungen) und eine
Bag
datastructure, dass beschrieben wird, wieAlso genau das was du brauchst.
Deine erste Methode ist besser geeignet, um mein Bedürfnis. Aber es gibt ein problem. Wenn ich mehr als ein Artikel in der Liste dann so rufen Sie die anderen Artikel aus der Liste?
Wenn Sie gleich sind, warum stören Sie abrufen? Sie wissen schon, was drinnen ist! Oder gibt es Felder, die nicht geben Sie Ihre
equals
Vergleich? Oder sind Sie auf der Suche nach mehr als nur abrufen, wie vielleicht löschen?Meinst du
counters.containsKey(newEl)
InformationsquelleAutor Jack
Dies ist einfach zu tun mit der hand.
Beachten Sie, dass wenn Sie nicht überschreiben
equals
in IhremItem
Klasse, diese Methode wird mit dem Objekt-Identität (diese ist die Umsetzung derObject.equals()
).Bearbeiten: Bezüglich deiner zweiten Frage (bitte versuchen Sie, zu begrenzen, Beiträge zu einer Frage pro Stück), können Sie dies von hand als auch.
Set
weil es ist ein fester Grund für die nicht-Verwendung Festgelegt, in meinem Fall.Denken Sie über die Tatsache, dass zum zählen von Objekten müssen Sie SOWIESO gehen durch die gesamte Liste, da werden Sie haben, um Sie alle zu überprüfen, zu wissen, die genaue Zahl.
Wenn Sie etwas wollen, die eine geringere Zeit, Komplexität, sind Sie aus Glück heraus - Sie wissen nichts über den Inhalt Ihrer Liste haben, müssen Sie überprüfen jede position. Eine Optimierung ist zu vergleichen die
hashCode
Ihres Artikels zu derhashCode
jedes Element in der Liste, aber wenn Sie gleich sind, dann müssen Sie noch überprüfen, für die Gleichstellung mitequals()
als Ihre Hashfunktion kann Kollisionen. Wenn Sie die Prüfung für die Objekt-Identität, es gibt keine Notwendigkeit, dies zu tun alsequals
vergleichen Sie die Speicher-Adressen oder so etwas ähnliches.Wenn dies ist etwas, das getan werden muss, Häufig und nimmt eine Leistung in Anspruch, als eine einfache Liste ist die falsche Struktur zu verwenden. Je nachdem, was Sie versuchen zu tun, vielleicht könnten Sie ändern Element, um eine zu zählen, und dann fügt die Suche für das Element und erhöht die Anzahl. Oder erstellen Sie eine andere Struktur zu halten, die zählt. Etc. Es gibt keine Magische Art und Weise zu suchen, eine Liste schneller als eine sequenzielle Traversierung.
Goel Java iterieren eine Liste mit tausenden ( oder sogar Hunderte von tausenden ) von Objekten in weniger als einer Sekunde.
InformationsquelleAutor danben
Als die anderen Befragten haben bereits gesagt,, wenn Sie sich nachdrücklich für die Speicherung Ihrer Elemente in einer sortierten ArrayList, dann zählen Gegenstände, dauert O(n) Zeit, wobei n die Anzahl der Elemente in der Liste. Hier bei SO, wir geben Ratschläge, aber wir tun nicht Magie!
Als ich nur angedeutet, wenn die Liste wird gesucht, viel mehr als Sie geändert wird, könnte es Sinn machen, es zu halten sortiert. Wenn deine Liste sortiert ist, dann finden Sie Ihr Element in O(log n) Zeit, das ist viel schneller; und wenn Sie eine
hashcode
Implementierung, die geht auch mit Ihrerequals
alle die identischen Elemente werden rechts neben jeder anderen.Andere Möglichkeit wäre das erstellen und pflegen von zwei Daten-Strukturen parallel. Man könnte ein
HashMap
mit Ihren Elementen wie Schlüssel und zählen als Werte. Sie wären verpflichtet, zu aktualisieren diese zweite Struktur jeder Zeit Ihre-Liste ändert, aber Elementanzahl lookups wäre o(1).InformationsquelleAutor Carl Smotricz
Ich könnte falsch sein, aber es scheint mir, wie die Daten-Struktur, die Sie tatsächlich wollen, könnte ein Multiset (aus google-Sammlungen/Guave), anstatt eine
List
. Es ermöglicht ein Vielfaches, im Gegensatz zuSet
, aber nicht wirklich Pflege über die Reihenfolge. Angesichts der Tatsache, dass es hat eineint count(Object element)
Methode, die genau das macht, was Sie wollen. Und da es nicht eine Liste und hat-Implementierungen unterstützt durch eineHashMap
ist, immer die Anzahl ist deutlich effizienter.InformationsquelleAutor ColinD
Danke für deine nette Anregung. Aber unter diesem code ist wirklich sehr nützlich, wir haben keinen such-Methode der Liste, um die Anzahl der vorkommen.
Dank Jack. Gutes posting.
Dank,
Binod Suman
http://binodsuman.blogspot.com
InformationsquelleAutor Ayush Suman