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.
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%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.
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.
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: -)
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.
Sie können count()
von Eclipse-Sammlungen verwenden.
Wenn Sie customList nicht von List
ändern können:
Wenn Sie eine Methode haben, die nach einem Namen sucht, können Sie auch countWith()
:
Hinweis: Ich spende Beiträge zu Eclipse Collections.