Zählt die Anzahl der Objekte mit der Eigenschaft

8

Ich habe die Liste List<Custom> , wo Custom wie

ist %Vor%

Wie bekomme ich die Anzahl der Gegenstände mit dem Namen "Tom"? Gibt es einen einfacheren Weg als eine for-Schleife?

    
Damir 06.02.2012, 18:29
quelle

10 Antworten

7

Dies kann jetzt einfach mit Java 8 Streams durchgeführt werden - keine zusätzlichen Bibliotheken erforderlich.

%Vor%     
matvei 25.02.2016 19:12
quelle
5

Wenn Sie an mehreren Stellen nach Namen filtern, und insbesondere, wenn Sie diesen Filter zur Laufzeit mit anderen Filtern verknüpfen möchten, Google Guava Prädikate können Ihnen helfen:

%Vor%

Sobald Sie dieses Prädikat codiert haben, wird das Filtern und Zählen nur eine Zeile Code benötigen.

%Vor%

Wie Sie sehen, ist die ausführliche Konstruktion eines Prädikats (funktioneller Stil) nicht immer lesbarer, schneller oder spart Codezeilen im Vergleich zu Schleifen (imperativer Stil). In der Guava-Dokumentation wird ausdrücklich angegeben, dass der imperative Stil standardmäßig verwendet werden sollte. Aber Prädikate sind sowieso ein nettes Werkzeug.

    
Anthony Accioly 06.02.2012 19:13
quelle
4

Persönlich mag ich die Apache Commons Collection lib, wenn ich kann. (Aber die auf Sourceforge, da es Generics verwendet) Es lässt Sie einige ziemlich elegante Dinge wie Mapping-Listen oder Filterlisten (in einer schematischen Weise). Du würdest am Ende so etwas schreiben:

%Vor%

Der einzige Nachteil ist, dass, da Java keine Funktionen erster Ordnung hat, Sie kleine Objekte wie diese Prädikat-Instanz schreiben müssen. Es wäre sauberer, wenn Sie anonyme Funktionen schreiben könnten. in scala wäre es das:

%Vor%     
JohnnyK 06.02.2012 19:04
quelle
2

Es gibt keine einfachere Lösung mit den Standardsammlungen. Sie müssen über die Liste iterieren und die Vorkommen des Namens zählen.

    
Jan Henke 06.02.2012 18:33
quelle
1

Entweder Sie verfolgen, wie Sie Elemente aus der Liste hinzufügen oder entfernen. Dies könnte an die Stelle einer Hashmap Name- & gt; Count treten. Wenn Sie ein Element hinzufügen, erhöhen Sie die Anzahl für diesen Namen, und wenn Sie es entfernen, dekrementieren Sie die Anzahl.

Oder Sie durchlaufen die Sammlung mit einer Schleife, die nach dem fraglichen Namen sucht.

Abhängig vom Verhalten Ihrer Anwendung wird eine dieser Methoden schneller sein, aber ohne weitere Informationen ist es schwer zu sagen, welche.

    
RussS 06.02.2012 18:34
quelle
1

Leichter wahrscheinlich nicht. Jetzt könnten Sie Ihre Objekte in einer Map & lt; String, List & lt; Custom & gt; & gt; statt wo der Schlüssel ist der Name. Um die Anzahl der Elemente mit Name == "Tom" zu erhalten, können Sie einfach Folgendes tun:

%Vor%     
assylias 06.02.2012 18:36
quelle
1

Sie können die Liste auch vor dem Looping sortieren und dann dividieren und erobern, um Übereinstimmungen zu finden, und dann zählen. Es hängt wirklich von Ihren Bedürfnissen ab, wie viele Elemente? Gibt es nach einer Suche viele Einfügungen? usw.

    
Todd Murray 06.02.2012 18:43
quelle
1

Die Art und Weise, wie es jetzt definiert wird, erfordert immer eine Schleife über die Liste.

Es ist eine gute Idee, einen sekundären Index mit einer Zuordnung von Namen zur Liste der IDs zu erstellen.

Eine weitere Option wäre, sicherzustellen, dass die Liste nach Namen geordnet ist. In diesem Fall würden alle "Toms" nebeneinander gespeichert werden. Dann könntest du die Faust "Tom" in O (log (n)) Zeit mit einer binären Suche finden und einfach weiter von dort bis zu einem Nicht-Tom oder Ende der Liste zählen. Die Einfügeoperation hätte eine O (n) -Komplexität, da Sie alle Elemente nach der Einfügeposition um eine Position verschieben müssen. Berücksichtigen Sie dies also sorgfältig: -)

    
Krzysztof Kozielczyk 06.02.2012 18:57
quelle
0

Was ist damit? :

%Vor%

Verwendung:

%Vor%

Ausgabe:

%Vor%

Es könnte nützlich sein, wenn Sie häufig Ihre Zähloperationen verwenden. Hinweis: Sie sollten den Namen des benutzerdefinierten Objekts nicht ändern, es sollte endgültig sein:

%Vor%

Sie müssen auch etwas mit der Liste machen, wenn Sie den Namen eines benutzerdefinierten Objekts aus der Liste ändern.

    
kornero 06.02.2012 19:52
quelle
0

Sie können count() von Eclipse-Sammlungen verwenden.

%Vor%

Wenn Sie customList nicht von List ändern können:

%Vor%

Wenn Sie eine Methode haben, die nach einem Namen sucht, können Sie auch countWith() :

verwenden %Vor%

Hinweis: Ich spende Beiträge zu Eclipse Collections.

    
Nikhil Nanivadekar 27.03.2016 03:10
quelle

Tags und Links