Wenn Sie filter durch name an mehreren stellen, und besonders, wenn Sie an die Kette, die filter mit anderen zur Laufzeit ermittelt, Google Guava Prädikate kann Ihnen helfen:
Sobald Sie codiert haben, das Prädikat, das filtern und zählen, wird nur eine Zeile code.
int size =Collections2.filter(customList, nameIs("Tom")).size();
Wie Sie sehen können, ist die ausführliche Bau eines Prädikats (funktionaler Stil) nicht immer besser lesbar, schneller oder speichern Sie code-Zeilen verglichen mit Schleifen (imperativen Stil). Eigentlich Guave-Dokumentation ausdrücklich fest, dass der Imperativ-Stil, der standardmäßig verwendet werden soll. Aber Prädikate sind ein nettes tool zu haben sowieso.
Persönlich nutze ich gerne die Apache-Commons-Sammlung lib, wenn ich kann. (Aber die man auf sourceforge, da es verwendet generics), die Es ermöglicht, Sie haben einige ziemlich elegante Dinge wie mapping-Listen oder filtern von Listen (in einem System-ish Weg). Würden Sie am Ende das schreiben etwas wie dieses:
int count =CollectionUtils.countMatches(myList,newPredicate<Custom>(){publicboolean evaluate(Custom c){return"Tom".equals(c.name);}}
Der einzige Nachteil ist, dass da Java nicht first-order-Funktionen, die Sie haben zu schreiben, kleine Objekte wie das Prädikat Instanz. Es wäre sauberer, wenn Sie schreiben könnten, anonyme Funktionen. also im scala, wäre es dieser:
val myList =List("a","a","b","c","a")
val c = myList.count{"a".equals(_)}//is 3
Entweder Sie verfolgen, wie Sie Elemente hinzufügen oder entfernen aus der Liste. Diese könnte an die Stelle einer hashmap Name->Count . Wo, wenn Sie ein Element hinzufügen, erhöhen Sie die Anzahl der für den Namen, und wenn Sie es entfernen Sie verringern Sie die Anzahl.
Oder Sie Durchlaufen die Kollektion mit einer Schleife prüft, ob der name in Frage.
Je nach dem Verhalten der Anwendung einer dieser Methoden wird schneller sein, aber ohne mehr Informationen ist es schwer zu sagen, welche.
Einfacher, wahrscheinlich nicht.
Jetzt könnte man speichern Ihre Objekte in einer Map <String, List<Custom>> statt, wobei der Schlüssel der name.
Um die Anzahl der Elemente in dem name == "Tom" können Sie dann einfach machen:
List<Custom> l = myMap.get("Tom");int count =0;if(l !=null){
count = l.size();}
Könnte man die Liste auch Sortieren, bevor Sie Schleifen, dann verwenden Sie Teile und herrsche " -zu finden, die passt, dann zählen. Es hängt wirklich von Ihren Bedürfnissen, wie viele Elemente? Gibt es eine Menge von Einfügungen, die nach einer Suche? etc
Die Art und Weise ist es nun definiert wird, erfordert immer eine Schleife über die Liste.
Erstellen eines sekundären Indexes mit einer Zuordnung von Namen zu der Liste der ids ist eine gute Idee.
Eine weitere option wäre, dass die Liste ist sortiert nach Namen, in dem Fall alle "Tom"s gespeichert werden würde, nebeneinander. Dann Sie finden konnte, die Faust "Tom" in O(log(n)) mal bei einer binären Suche, und nur zu halten, zählen von dort aus, bis Sie eine nicht-"Tom" oder das Ende der Liste. Die insert-operation O(n) Komplexität, wie Sie benötigen, um alle Elemente nach der Einfügeposition von einer position, so prüfen Sie diese sorgfältig 🙂
Könnte es nützlich sein, wenn Sie Häufig verwenden Sie Ihre count-Operationen. Hinweis: Sie sollten nicht ändern Sie den Namen des benutzerdefinierten Objekts, sollte es endgültig sein:
Hinweis: ich bin ein Beitrag zu Eclipse Sammlungen.
Eclipse Sammlungen klingt wie eine große Bibliothek, aber es ist total übertrieben für etwas, das Sie tun können, genauso gut mit built-in Funktionen der Sprache.
Diese kann getan werden einfach mit Java-8-streams — keine zusätzlichen Bibliotheken erforderlich.
Wenn Sie filter durch name an mehreren stellen, und besonders, wenn Sie an die Kette, die filter mit anderen zur Laufzeit ermittelt, Google Guava Prädikate kann Ihnen helfen:
Sobald Sie codiert haben, das Prädikat, das filtern und zählen, wird nur eine Zeile code.
Wie Sie sehen können, ist die ausführliche Bau eines Prädikats (funktionaler Stil) nicht immer besser lesbar, schneller oder speichern Sie code-Zeilen verglichen mit Schleifen (imperativen Stil). Eigentlich Guave-Dokumentation ausdrücklich fest, dass der Imperativ-Stil, der standardmäßig verwendet werden soll. Aber Prädikate sind ein nettes tool zu haben sowieso.
Persönlich nutze ich gerne die Apache-Commons-Sammlung lib, wenn ich kann. (Aber die man auf sourceforge, da es verwendet generics), die Es ermöglicht, Sie haben einige ziemlich elegante Dinge wie mapping-Listen oder filtern von Listen (in einem System-ish Weg). Würden Sie am Ende das schreiben etwas wie dieses:
Der einzige Nachteil ist, dass da Java nicht first-order-Funktionen, die Sie haben zu schreiben, kleine Objekte wie das Prädikat Instanz. Es wäre sauberer, wenn Sie schreiben könnten, anonyme Funktionen. also im scala, wäre es dieser:
Gibt es keine einfachere Lösung mit der standard-Sammlungen. Sie haben, um die Liste Durchlaufen und zählen der vorkommen des namens.
Entweder Sie verfolgen, wie Sie Elemente hinzufügen oder entfernen aus der Liste. Diese könnte an die Stelle einer hashmap Name->Count . Wo, wenn Sie ein Element hinzufügen, erhöhen Sie die Anzahl der für den Namen, und wenn Sie es entfernen Sie verringern Sie die Anzahl.
Oder Sie Durchlaufen die Kollektion mit einer Schleife prüft, ob der name in Frage.
Je nach dem Verhalten der Anwendung einer dieser Methoden wird schneller sein, aber ohne mehr Informationen ist es schwer zu sagen, welche.
Einfacher, wahrscheinlich nicht.
Jetzt könnte man speichern Ihre Objekte in einer Map <String, List<Custom>> statt, wobei der Schlüssel der name.
Um die Anzahl der Elemente in dem name == "Tom" können Sie dann einfach machen:
Könnte man die Liste auch Sortieren, bevor Sie Schleifen, dann verwenden Sie Teile und herrsche " -zu finden, die passt, dann zählen. Es hängt wirklich von Ihren Bedürfnissen, wie viele Elemente? Gibt es eine Menge von Einfügungen, die nach einer Suche? etc
Die Art und Weise ist es nun definiert wird, erfordert immer eine Schleife über die Liste.
Erstellen eines sekundären Indexes mit einer Zuordnung von Namen zu der Liste der ids ist eine gute Idee.
Eine weitere option wäre, dass die Liste ist sortiert nach Namen, in dem Fall alle "Tom"s gespeichert werden würde, nebeneinander. Dann Sie finden konnte, die Faust "Tom" in O(log(n)) mal bei einer binären Suche, und nur zu halten, zählen von dort aus, bis Sie eine nicht-"Tom" oder das Ende der Liste. Die insert-operation O(n) Komplexität, wie Sie benötigen, um alle Elemente nach der Einfügeposition von einer position, so prüfen Sie diese sorgfältig 🙂
Was ist das? :
Verwendung:
Ausgabe:
Könnte es nützlich sein, wenn Sie Häufig verwenden Sie Ihre count-Operationen.
Hinweis: Sie sollten nicht ändern Sie den Namen des benutzerdefinierten Objekts, sollte es endgültig sein:
Oder Sie etwas tun müssen, mit list zu, wenn Sie ändern der Namen von Benutzerdefinierten Objekt aus der Liste.
Können Sie
count()
aus Eclipse-Sammlungen.Wenn Sie nicht ändern können customList von
List
:Wenn Sie eine Methode, die prüft, ob ein name können Sie auch
countWith()
:Hinweis: ich bin ein Beitrag zu Eclipse Sammlungen.