web-dev-qa-db-fra.com

Comment obtenir l'index de la boucle en cours lors de l'utilisation d'Iterator?

J'utilise un itérateur pour parcourir une collection .__ et je souhaite obtenir l'index de l'élément en cours. 

Comment puis je faire ça?

83
Mahmoud Saleh

Utilisez votre propre variable et incrémentez-la dans la boucle.

80
Chris Diver

J'ai eu la même question et trouvé en utilisant un ListIterator a fonctionné. Similaire au test ci-dessus:

List<String> list = Arrays.asList("zero", "one", "two");

ListIterator iter = list.listIterator();

while (iter.hasNext()) {
    System.out.println("index: " + iter.nextIndex() + " value: " + iter.next());
}

Assurez-vous d'appeler le nextIndex AVANT que vous obteniez réellement le prochain ().

87
Paul

Voici une façon de le faire en utilisant votre propre variable et en la gardant concise:

List<String> list = Arrays.asList("zero", "one", "two");

int i = 0;
for (Iterator<String> it = list.iterator(); it.hasNext(); i++) {
    String s = it.next();
    System.out.println(i + ": " + s);
}

Sortie (vous l'avez deviné):

0: zero
1: one
2: two

L'avantage est que vous n'augmentez pas votre index dans la boucle (même si vous devez faire attention à ne jamais appeler Iterator # qu'une fois par boucle - faites-le en haut).

26
Tom Clift

Vous pouvez utiliser ListIterator pour compter:

final List<String> list = Arrays.asList("zero", "one", "two", "three");

for (final ListIterator<String> it = list.listIterator(); it.hasNext();) {
    final String s = it.next();
    System.out.println(it.previousIndex() + ": " + s);
}
19
Robert Klemme

Quel genre de collection? S'il s'agit d'une implémentation de l'interface List, vous pouvez simplement utiliser it.nextIndex() - 1.

10
Mateusz Dymczyk

Utilisez un ListIterator pour parcourir la collection. Si la collection n'est pas une liste, commencez par utiliser Arrays.asList(Collection.toArray()) pour la transformer en liste.

4
Jatin

Utilisez un int et incrémentez-le dans votre boucle.

2
Florian Reischl

Voir ici .

iterator.nextIndex() fournirait un index d'élément qui serait renvoyé par un appel ultérieur à next()

1
Jolly

faites juste quelque chose comme ça:

        ListIterator<String> it = list1.listIterator();
        int index = -1;
        while (it.hasNext()) {
            index++;
            String value = it.next();
            //At this point the index can be checked for the current element.

        }
1
Sunny

Tout ce dont vous avez besoin pour utiliser iterator.nextIndex () pour renvoyer l'index actuel sur lequel se trouve l'itérateur. Cela pourrait être un peu plus facile que d’utiliser votre propre variable de compteur (qui fonctionne toujours aussi).

public static void main(String[] args) {    
    String[] str1 = {"list item 1", "list item 2", "list item 3", "list item 4"};
    List<String> list1 = new ArrayList<String>(Arrays.asList(str1));

    ListIterator<String> it = list1.listIterator();

    int x = 0;

    //The iterator.nextIndex() will return the index for you.
    while(it.hasNext()){
        int i = it.nextIndex();
        System.out.println(it.next() + " is at index" + i); 
    }
}

Ce code parcourt la liste list1, un élément à la fois et imprime le texte de l'élément, puis "est à l'index", puis affiche l'index que l'itérateur a trouvé. :)

0
Ryan

Bien que vous ayez déjà eu la réponse, pensé à ajouter quelques informations.

Comme vous avez mentionné explicitement Collections, vous ne pouvez pas utiliser listIterator pour obtenir l'index pour tous les types de collections.

Liste des interfaces - ArrayList, LinkedList, Vector et Stack.

A à la fois iterator() et listIterator()

Définir les interfaces - HashSet, LinkedHashSet, TreeSet et EnumSet.

A seulement iterator()

Interfaces de carte - HashMap, LinkedHashMap, TreeMap et IdentityHashMap

N'a pas d'itérateurs, mais peut être itéré avec keySet()/values() ou entrySet() en tant que keySet() et entrySet() renvoie Set et values() renvoie Collection.

Il est donc préférable d’utiliser iterators() avec un incrément continu d’une valeur pour obtenir l’index actuel de tout type de collection.

0
Vignesh Raja