@finnw No creo que estén duplicados. Esta pregunta se hace usando Iterator, la otra está usando for-each loop. Ambas preguntas se resuelven con un enfoque similar, por lo que las respuestas son duplicadas, no la pregunta.
Robert
Respuestas:
92
Use su propia variable e increméntela en el ciclo.
Gracias por mencionar 'Asegúrese de llamar al nextIndex ANTES de obtener el next ()'
Gangadhar JANNU
Gracias, no sabía nada de esto antes. La advertencia que haría es que ListIterator es bidireccional mientras que Iterator es unidireccional. Siempre que evite moverse hacia adelante y hacia atrás con lo que efectivamente es un cursor, debe estar seguro.
user2910265
28
Aquí hay una forma de hacerlo usando su propia variable y manteniéndola concisa:
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);}
Salida (lo adivinaste):
0: zero
1: one
2: two
La ventaja es que no incrementas tu índice dentro del ciclo (aunque debes tener cuidado de llamar al Iterador # siguiente solo una vez por ciclo, solo hazlo en la parte superior).
Si crea el iterador usted mismo, también puede usar un ListIterator y no necesita la variable int separada.
Robert Klemme
1
Si usa una 'importación estática' para Arrays.asList, simplemente puede escribirasList("zero", "one", "two")
karmakaze
así es exactamente como lo hice antes de leer la respuesta de Paul. Desaconsejaría fuertemente su camino, porque no veo ninguna ventaja en ello. ¿Crees que hay una ventaja (excepto por la mencionada)? ¿Por qué no usaste un bucle para cada uno? No es necesario definir el iterador explícitamente si usa su propia variable.
Willi Mentzel
@progressive_overload solo si necesita un iterador (según la pregunta, por ejemplo, para pasar a la biblioteca), que el ejemplo no muestra. En este ejemplo, tiene una variable fuera del bucle y debe tener cuidado de llamar a #next una vez. En el ejemplo de Paul, no hay variables fuera del ciclo, pero debe tener cuidado de llamar a #next y #nextIndex juntos una vez (y en la práctica, si se usan más de una vez, se incluirán en variables locales, lo que ese ejemplo no hace ' t mostrar).
Tom Clift
23
Puede usar ListIteratorpara hacer el conteo:
finalList<String> list =Arrays.asList("zero","one","two","three");for(finalListIterator<String> it = list.listIterator(); it.hasNext();){finalString s = it.next();System.out.println(it.previousIndex()+": "+ s);}
Utilice un ListIterator para recorrer la colección. Si la colección no es una lista, para empezar, utilice Arrays.asList(Collection.toArray())para convertirla en una lista primero.
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.}
La interfaz Iterator NO tiene el método nextIndex (). Necesita usar explícitamente un ListIterator para eso, pero el OP cuestionó específicamente sobre Iterator.
Fran Marzoa
0
Todo lo que necesita para usarlo es el iterator.nextIndex () para devolver el índice actual en el que se encuentra el iterador. Esto podría ser un poco más fácil que usar su propia variable de contador (que también funciona).
publicstaticvoid main(String[] args){String[] str1 ={"list item 1","list item 2","list item 3","list item 4"};List<String> list1 =newArrayList<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);}}
Este código pasará por la lista list1 un elemento a la vez e imprimirá el texto del elemento, luego "está en el índice" y luego imprimirá el índice en el que lo encontró el iterador. :)
Respuestas:
Use su propia variable e increméntela en el ciclo.
fuente
it.nextIndex()
. Útil cuando la colección es una Lista.Tenía la misma pregunta y descubrí que usar un ListIterator funcionaba. Similar a la prueba anterior:
Asegúrese de llamar al nextIndex ANTES de obtener el next ().
fuente
Aquí hay una forma de hacerlo usando su propia variable y manteniéndola concisa:
Salida (lo adivinaste):
La ventaja es que no incrementas tu índice dentro del ciclo (aunque debes tener cuidado de llamar al Iterador # siguiente solo una vez por ciclo, solo hazlo en la parte superior).
fuente
asList("zero", "one", "two")
Puede usar
ListIterator
para hacer el conteo:fuente
¿Qué tipo de colección? Si se trata de una implementación de la interfaz List, entonces podría usar
it.nextIndex() - 1
.fuente
Utilice un ListIterator para recorrer la colección. Si la colección no es una lista, para empezar, utilice
Arrays.asList(Collection.toArray())
para convertirla en una lista primero.fuente
solo haz algo como esto:
fuente
Use un int e increméntelo dentro de su ciclo.
fuente
Vea aquí .
iterator.nextIndex()
proporcionaría un índice de elemento que sería devuelto por una llamada posterior anext()
.fuente
Todo lo que necesita para usarlo es el iterator.nextIndex () para devolver el índice actual en el que se encuentra el iterador. Esto podría ser un poco más fácil que usar su propia variable de contador (que también funciona).
Este código pasará por la lista list1 un elemento a la vez e imprimirá el texto del elemento, luego "está en el índice" y luego imprimirá el índice en el que lo encontró el iterador. :)
fuente
Aunque ya tenía la respuesta, pensó en agregar algo de información.
Como mencionó Colecciones explícitamente, no puede usar
listIterator
para obtener el índice para todos los tipos de colecciones.Listar interfaces : ArrayList, LinkedList, Vector y Stack.
Tiene ambos
iterator()
ylistIterator()
Establecer interfaces : HashSet, LinkedHashSet, TreeSet y EnumSet.
Sólo tiene
iterator()
Interfaces de mapas : HashMap, LinkedHashMap, TreeMap e IdentityHashMap
No tiene iteradores, pero se puede iterar mediante
keySet()
/values()
oentrySet()
askeySet()
yentrySet()
devuelveSet
yvalues()
devuelveCollection
.Por lo tanto, es mejor usarlo
iterators()
con un incremento continuo de un valor para obtener el índice actual para cualquier tipo de colección.fuente
¡Esta sería la solución más simple!
Probado en gcc-9 con
-std=c++11
banderaSalida:
fuente