Ich habe eine ArrayList
, eine Collection-Klasse von Java, wie folgt:
ArrayList<String> animals = new ArrayList<String>();
animals.add("bat");
animals.add("owl");
animals.add("bat");
animals.add("bat");
Wie Sie sehen können, animals
ArrayList
besteht das aus 3 bat
Elementen und einem owl
Element. Ich habe mich gefragt, ob es im Collection-Framework eine API gibt, die die Anzahl der bat
Vorkommen zurückgibt, oder ob es eine andere Möglichkeit gibt, die Anzahl der Vorkommen zu bestimmen.
Ich habe festgestellt, dass die Google-Sammlung Multiset
über eine API verfügt, die die Gesamtzahl der Vorkommen eines Elements zurückgibt. Das ist aber nur mit JDK 1.5 kompatibel. Unser Produkt befindet sich derzeit in JDK 1.6, daher kann ich es nicht verwenden.
Antworten:
Ich bin mir ziemlich sicher, dass die statische Frequenzmethode in Sammlungen hier nützlich sein würde:
So würde ich es sowieso machen. Ich bin mir ziemlich sicher, dass dies JDK 1.6 ist.
quelle
In Java 8:
quelle
Collections.frequency()
? Es scheint weniger lesbar.Dies zeigt, warum es wichtig ist, " Objekte über ihre Schnittstellen zu referenzieren ", wie im Buch " Effektives Java " beschrieben .
Wenn Sie für die Implementierung codieren und ArrayList an beispielsweise 50 Stellen in Ihrem Code verwenden und eine gute "List" -Implementierung finden, die die Elemente zählt, müssen Sie alle diese 50 Stellen ändern, und wahrscheinlich müssen Sie dies tun Brechen Sie Ihren Code (wenn er nur von Ihnen verwendet wird, gibt es keine große Sache, aber wenn er von jemand anderem verwendet wird, brechen Sie auch dessen Code)
Durch Programmieren auf die Schnittstelle können Sie diese 50 Stellen unverändert lassen und die Implementierung von ArrayList in "CountItemsList" (zum Beispiel) oder eine andere Klasse ersetzen.
Im Folgenden finden Sie ein sehr einfaches Beispiel dafür, wie dies geschrieben werden könnte. Dies ist nur ein Beispiel, eine produktionsreife Liste wäre viel komplizierter.
Hier angewandte OO-Prinzipien: Vererbung, Polymorphismus, Abstraktion, Kapselung.
quelle
Leider gibt es keinen einfachen Methodenaufruf, der dies ermöglicht. Alles, was Sie tun müssen, ist eine Karte zu erstellen und die Häufigkeit damit zu zählen.
quelle
In Java gibt es keine native Methode, um dies für Sie zu tun. Sie können jedoch IterableUtils # countMatches () aus Apache Commons-Collections verwenden, um dies für Sie zu tun.
quelle
Tatsächlich verfügt die Collections-Klasse über eine statische Methode namens: Frequency (Collection c, Object o), die die Anzahl der Vorkommen des gesuchten Elements zurückgibt. Dies funktioniert übrigens perfekt für Sie:
quelle
Ich frage mich, warum Sie die Google Collection-API nicht mit JDK 1.6 verwenden können. Sagt es so? Ich denke, Sie können, es sollte keine Kompatibilitätsprobleme geben, da es für eine niedrigere Version gebaut wurde. Der Fall wäre anders gewesen, wenn das für 1.6 erstellt worden wäre und Sie 1.5 ausführen.
Liege ich irgendwo falsch
quelle
Alternative Java 8- Lösung mit Streams :
quelle
Ein etwas effizienterer Ansatz könnte sein
quelle
So rufen Sie die Vorkommen des Objekts direkt aus der Liste ab:
Überschreiben Sie die equals-Methode in der Object-Klasse wie folgt, um das Auftreten der Object-Auflistung in der Liste zu ermitteln:
Rufen Sie die Collections.frequency auf als:
quelle
Einfache Methode zum Ermitteln des Auftretens von Zeichenfolgenwerten in einem Array mithilfe von Java 8-Funktionen.
Ausgabe: {Katze = 2, Ziege = 1, Kuh = 1, Kuh = 1, Hund = 1}
Sie können feststellen, dass "Cow" und cow nicht als dieselbe Zeichenfolge betrachtet werden. Verwenden Sie .toLowerCase (), falls Sie dies unter derselben Anzahl erforderlich gemacht haben. Bitte finden Sie das Snippet unten für das gleiche.
Ausgabe: {Katze = 2, Kuh = 2, Ziege = 1, Hund = 1}
quelle
toString()
ist sie nicht erforderlich. Sie können einfach tun:duplicateList.stream().collect(Collectors.groupingBy(e -> e,Collectors.counting()));
Was Sie wollen, ist eine Tasche - die wie ein Set ist, aber auch die Anzahl der Vorkommen zählt. Leider ist das Java Collections Framework - großartig, da sie kein Bag Impl haben. Dazu muss der Linktext Apache Common Collection verwendet werden
quelle
Methode 1:
Methode 2:
quelle
Wenn Sie Eclipse-Sammlungen verwenden , können Sie a verwenden
Bag
. AMutableBag
kann von jeder Implementierung vonRichIterable
per Aufruf zurückgegeben werdentoBag()
.Die
HashBag
Implementierung in Eclipse Collections wird durch a unterstütztMutableObjectIntMap
.Hinweis: Ich bin ein Committer für Eclipse-Sammlungen.
quelle
Fügen Sie die Elemente der Arrayliste in die HashMap ein, um die Häufigkeit zu zählen.
quelle
Java 8 - eine andere Methode
quelle
Also mach es auf die altmodische Art und roll deine eigene:
quelle
Wenn Sie ein Benutzer von ForEach DSL sind , kann dies mit einer
Count
Abfrage erfolgen.quelle
Ich wollte diesen Fall nicht schwieriger machen und machte es mit zwei Iteratoren. Ich habe eine HashMap mit Nachname -> Vorname. Und meine Methode sollte Elemente mit dem doppelten Vornamen löschen.
quelle
Ausgabe:
quelle
quelle
quelle