Holen Sie sich die Größe eines Iterable in Java
Ich brauche, um herauszufinden, die Anzahl der Elemente in einem Iterable
in Java.
Ich weiß, ich kann dies tun:
Iterable values = ...
it = values.iterator();
while (it.hasNext()) {
it.next();
sum++;
}
Könnte ich auch so etwas tun, da brauche ich nicht die Objekte in der Iterierbar weitere:
it = values.iterator();
while (it.hasNext()) {
it.remove();
sum++;
}
Kleinen Maßstab-benchmark nicht so viel performance-Unterschied, Anregungen oder andere Ideen für dieses problem?
InformationsquelleAutor der Frage js84 | 2012-07-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
TL;DR: Verwenden Sie das Dienstprogramm Methode
Iterables.Größe(Durchsuchbar)
der großen Guave Bibliothek.Ihrer zwei code-snippets, die Sie verwenden sollten, denn der zweite wird entfernen Sie alle Elemente aus
values
so ist es danach leer. Ändern einer Datenstruktur für eine einfache Abfrage, wie seine Größe ist sehr unerwartet.Für Leistung, dies ist abhängig von Ihrer Datenstruktur. Wenn es zum Beispiel in der Tat ein
ArrayList
entfernen von Elementen vom Anfang (was deine zweite Methode ist dabei) ist sehr langsam (die Berechnung der Größe wird O(n*n) anstatt O(n), wie es sein sollte).In der Regel, wenn es ist die chance, dass
values
ist eigentlich einCollection
und nicht nur eineIterable
haben, prüfen Sie diese und rufen Siesize()
im Fall:Den Aufruf
size()
wird in der Regel viel schneller als das zählen der Anzahl der Elemente, und dieser trick ist genau das, wasIterables.Größe(Durchsuchbar)
von Guave für Sie tut.InformationsquelleAutor der Antwort Philipp Wendler
Wenn Sie arbeiten mit java 8 können Sie verwenden:
wird es nur funktionieren, wenn die wiederholenden Quelle hat eine bestimmt Größe. Die meisten Spliterators für Sammlungen, aber Sie müssen möglicherweise Probleme, wenn es darum geht, aus einer
HashSet
oderResultSet
zum Beispiel.Können Sie die javadoc hier.
Wenn Java 8 ist nicht eine optionoder wenn Sie nicht wissen, wo die iterierbar kommt, können Sie verwenden den gleichen Ansatz, wie Guave:
InformationsquelleAutor der Antwort ArnaudR
Dies ist vielleicht ein bisschen spät, aber kann jemand helfen. Ich stoße ähnliches Problem mit
Iterable
in meinem codebase und die Lösung war die Verwendungfor each
ohne explizites aufrufen vonvalues.iterator();
.InformationsquelleAutor der Antwort pilot
Streng genommen, Durchsuchbar keine Größe. Denke Datenstruktur wie ein Zyklus.
Und denken Sie über folgende Wiederholenden Instanz, Keine Größe:
InformationsquelleAutor der Antwort 卢声远 Shengyuan Lu
Können Sie werfen Sie Ihre durchsuchbar zu einer Liste dann verwenden .Größe() auf.
Gründen der übersichtlichkeit, die obige Methode erfordert die folgenden import:
InformationsquelleAutor der Antwort snacks
Ich würde für
it.next()
aus dem einfachen Grund, dassnext()
ist garantiert umgesetzt werden, währendremove()
ist eine optionale operation.InformationsquelleAutor der Antwort aioobe
Als für mich sind das nur verschiedene Methoden. Die ersten Blätter des Objekts, das Sie überarbeiten unverändert, während die Sekunden lässt es leer.
Die Frage ist, was Sie tun möchten.
Die Komplexität der Entfernung basiert auf der Umsetzung Ihrer wiederholenden Objekt.
Wenn Sie über die Sammlungen - gerade zu erhalten die Größe, wie vorgeschlagen wurde von Kazekage Gaara - seine in der Regel der beste Ansatz, Leistung Weise.
InformationsquelleAutor der Antwort Mark Bramnik
Anstelle der Verwendung von Schleifen und zählen jedes element oder mithilfe Dritter und die Bibliothek können wir einfach die festgelegten durchsuchbar, die in ArrayList und seine Größe.
InformationsquelleAutor der Antwort fatimasajjad
Warum nicht nutzen Sie einfach die
size()
Methode auf IhreCollection
um die Anzahl der Elemente?Iterator
soll nur Durchlaufen werden,sonst nichts.InformationsquelleAutor der Antwort Kazekage Gaara