D'obtenir la taille d'un objet iterable en Java
J'ai besoin de comprendre le nombre d'éléments dans un Iterable
en Java.
Je sais que je peux le faire:
Iterable values = ...
it = values.iterator();
while (it.hasNext()) {
it.next();
sum++;
}
Je pourrais aussi faire quelque chose comme ça, parce que je n'ai pas besoin des objets dans l'Itérable plus loin:
it = values.iterator();
while (it.hasNext()) {
it.remove();
sum++;
}
Petite échelle de référence n'a pas beaucoup de différence de performances, des commentaires ou d'autres idées pour ce problème?
- Pourquoi? Soit est une très mauvaise idée, car les deux sont de O(N). Vous devriez essayer d'éviter d'avoir à effectuer une itération de la collecte à deux reprises.
- Votre deuxième il ne faut même pas le travail. Vous ne pouvez pas appeler
remove()
sans appelnext()
à l'avance.
Vous devez vous connecter pour publier un commentaire.
TL;DR: Utilisation de l'utilitaire de méthode
Iterables.taille(Itératif)
de la grande Goyave bibliothèque.De vos deux extraits de code, vous devez utiliser la première, parce que la deuxième va supprimer tous les éléments de
values
, de sorte qu'il est vide. La modification d'une structure de données pour une simple requête comme sa taille est très inattendu.Pour la performance, cela dépend de votre structure de données. Si c'est pour l'exemple, en fait, un
ArrayList
, la suppression des éléments depuis le début (ce que votre deuxième méthode est en train de faire) est très lent (calcul de la taille devient O(n*n) au lieu de O(n) comme il se doit).En général, si il ya la possibilité que
values
est en fait unCollection
et pas seulement d'uneIterable
, vérifier et appelsize()
en cas de:L'appel à
size()
seront généralement beaucoup plus rapide que de compter le nombre d'éléments, et cette astuce est exactement ce queIterables.taille(Itératif)
de Goyave fait pour vous.values
Si vous travaillez avec java 8, vous pouvez utiliser:
il ne fonctionnera que si l'objet iterable source a une certaine taille. La plupart des Spliterators pour les Collections, mais vous pouvez avoir des problèmes si il s'agit d'un
HashSet
ouResultSet
par exemple.Vous pouvez vérifier l' javadoc ici.
Si Java 8 n'est pas une option, ou si vous ne savez pas où l'itérable, vous pouvez utiliser la même approche que la goyave:
C'est peut-être un peu tard, mais peut aider quelqu'un. Je viens à travers le même problème avec
Iterable
dans ma base de code et la solution a été d'utiliserfor each
sans appeler explicitementvalues.iterator();
.À proprement parler, Itérable n'a pas de taille. Pensez à la structure de données comme un cycle.
Et de réfléchir à la suite d'Itérable exemple, Pas de taille:
Vous pouvez lancer votre itérable à une liste d'utiliser ensuite .taille() sur celui-ci.
Par souci de clarté, la méthode ci-dessus nécessitera d'importation suivantes:
Je voudrais aller
it.next()
pour la simple raison quenext()
est la garantie d'être mis en œuvre, tandis queremove()
est une option de fonctionnement.remove
a déjà été noté que la mauvaise façon de compter les éléments d'unIterator
, de sorte qu'il n'a pas vraiment d'importance si la chose que l'on ne va pas faire est mis en œuvre ou pas.remove
est en œuvre, pourquoi serait-il mal à l'utiliser? Btw, downvotes sont typicallt pour de mauvaises réponses ou des réponses qui donnent de mauvais conseils. Je ne vois pas comment cette réponse se qualifie pour tout ça.Que pour moi, ce sont juste des méthodes différentes. La première on part de l'objet que vous êtes en itérant sur inchangé, tandis que les secondes le laisse vide.
La question est de savoir ce que vous voulez faire.
La complexité de la suppression est fondée sur la mise en œuvre de votre objet itérable.
Si vous êtes à l'aide de Collections - juste obtenir la taille comme a été proposée par le Kazekage Gaara - son généralement la meilleure approche de la performance sage.
Pourquoi ne pas simplement utiliser le
size()
méthode sur votreCollection
pour obtenir le nombre d'éléments?Iterator
est juste pour réitérer,rien d'autre.Iterator
etIterable
. Voir le voté de répondre de la manière correcte.Au lieu de l'aide de boucles de comptage et de chaque élément ou de l'utilisation et de la troisième partie de la bibliothèque, nous pouvons simplement transtypage de l'itérable dans la liste de tableaux et d'obtenir sa taille.