J'utilise un itérateur pour parcourir une collection et je souhaite obtenir l'index de l'élément actuel.
Comment puis je faire ça?
J'utilise un itérateur pour parcourir une collection et je souhaite obtenir l'index de l'élément actuel.
Comment puis je faire ça?
Réponses:
Utilisez votre propre variable et incrémentez-la dans la boucle.
it.nextIndex()
. Utile lorsque la collection est une liste.
J'ai eu la même question et j'ai trouvé que l'utilisation d'un ListIterator fonctionnait. 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 d'obtenir le next ().
Voici un moyen 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'incrémentez pas votre index dans la boucle (même si vous devez faire attention à n'appeler Iterator # next qu'une fois par boucle - faites-le simplement en haut).
asList("zero", "one", "two")
Vous pouvez utiliser ListIterator
pour faire le comptage:
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);
}
Quel genre de collection? S'il s'agit d'une implémentation de l'interface List, vous pouvez simplement utiliser it.nextIndex() - 1
.
Utilisez un ListIterator pour parcourir la collection. Si la collection n'est pas une liste pour commencer, utilisez d'abord Arrays.asList(Collection.toArray())
pour la transformer en liste.
faites 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.
}
Utilisez un int et incrémentez-le dans votre boucle.
Regardez ici .
iterator.nextIndex()
fournirait l'index de l'élément qui serait renvoyé par un appel ultérieur à next()
.
Tout ce dont vous avez besoin pour l'utiliser le 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 parcourra la liste list1 un élément à la fois et imprimera le texte de l'élément, puis "est à l'index" puis il imprimera l'index dans lequel l'itérateur l'a trouvé. :)
Bien que vous ayez déjà eu la réponse, j'ai pensé à ajouter quelques informations.
Comme vous l'avez mentionné explicitement Collections, vous ne pouvez pas utiliser listIterator
pour obtenir l'index pour tous les types de collections.
Interfaces de liste - ArrayList, LinkedList, Vector et Stack.
A à la fois iterator()
etlistIterator()
Définissez les interfaces - HashSet, LinkedHashSet, TreeSet et EnumSet.
A seulement iterator()
Interfaces cartographiques - HashMap, LinkedHashMap, TreeMap et IdentityHashMap
N'a pas d'itérateurs, mais peut être itéré à l'aide de keySet()
/ values()
ou entrySet()
as keySet()
et entrySet()
renvoie Set
et values()
retourne Collection
.
Il est donc préférable de l'utiliser iterators()
avec une incrémentation continue d'une valeur pour obtenir l'index actuel de tout type de collection.