107 votes

Quelle est la meilleure façon d'obtenir le nombre/la longueur/la taille d'un itérateur ?

Existe-t-il un moyen "calculé" rapide d'obtenir le nombre d'un itérateur ?

 int i = 0;
for ( ; some_iterator.hasNext() ; ++i ) some_iterator.next();

... semble être un gaspillage de cycles CPU.

99voto

Andrejs Points 4235

Utilisation de la bibliothèque Guava :

 int size = Iterators.size(iterator);

En interne, il parcourt simplement tous les éléments, donc c'est juste pour plus de commodité.

16voto

assylias Points 102015

Votre code vous donnera une exception lorsque vous atteignez la fin de l'itérateur. Vous pourriez faire:

 int i = 0;
while(iterator.hasNext()) {
    i++;
    iterator.next();
}

Si vous aviez accès à la collection sous-jacente, vous seriez en mesure d'appeler coll.size() ...

ÉDITER OK, tu as modifié...

13voto

gil.fernandes Points 5581

Vous devrez toujours itérer. Pourtant, vous pouvez utiliser Java 8, 9 pour faire le comptage sans boucler explicitement :

 Iterable<Integer> newIterable = () -> iter;
long count = StreamSupport.stream(newIterable.spliterator(), false).count();

Voici un essai :

 public static void main(String[] args) throws IOException {
    Iterator<Integer> iter = Arrays.asList(1, 2, 3, 4, 5).iterator();
    Iterable<Integer> newIterable = () -> iter;
    long count = StreamSupport.stream(newIterable.spliterator(), false).count();
    System.out.println(count);
}

Cela imprime :

 5

Assez intéressant, vous pouvez paralléliser l'opération de comptage ici en modifiant le parallel sur cet appel :

 long count = StreamSupport.stream(newIterable.spliterator(), *true*).count();

10voto

tashuhka Points 2205

En utilisant la bibliothèque Guava , une autre option consiste à convertir le Iterable en List .

 List list = Lists.newArrayList(some_iterator);
int count = list.size();

Utilisez ceci si vous devez également accéder aux éléments de l'itérateur après avoir obtenu sa taille. En utilisant Iterators.size() vous ne pouvez plus accéder aux éléments itérés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X