2010-08-07 18 views
168

En Java, ¿Cómo consigo el índice actual para el elemento en Java?Java, ¿Cómo consigo índice/clave actual en "para cada" bucle

for (Element song: question){ 
    song.currentIndex();   //<<want the current index. 
} 

En PHP usted puede hacer esto:

foreach ($arr as $index => $value) { 
    echo "Key: $index; Value: $value"; 
} 
+5

Esto se preguntó una vez al mes –

+0

En PHP, está utilizando una matriz asociativa que no es sinónimo de variedad de Java. – squiguy

Respuesta

238

No se puede, que sea necesario para mantener el índice por separado:

int index = 0; 
for(Element song : question) { 
    System.out.println("Current index is: " + (index++)); 
} 

o utilizar un bucle normal para:

for(int i = 0; i < question.length; i++) { 
    System.out.println("Current index is: " + i); 
} 

La razón es que se puede utilizar el condensado de sintaxis para bucle sobre cualquier Iterable, y no se garantiza que los valores realmente tengan un "índice"

+2

Este es de hecho la respuesta correcta semánticamente, para cada bucle puede iterar a través de flujo de datos desde una base de datos remota que se van a actualizar mientras se está iteración a través de su contenido (si el iterador utilizado realmente hace eso), en cuyo caso no hay manera de saber el índice actual. El índice es solo una * vista * de los datos, no una propiedad de los datos. – Esko

+1

Aunque podría no ser un índice, sería muy conveniente tener algún tipo de contador de iteraciones al que se pueda acceder dentro del ciclo. Supongo que tal cosa difícilmente puede terminar en Core Java, más oportunidades para algunos de los lenguajes de scripting. – akostadinov

+0

Como temía, tal vez en Java 12 lo agregarán como una característica de la que estar orgullosos, como lo hicieron recientemente con lambdas y leyendo archivos con frases ingeniosas. (DESCARGO DE RESPONSABILIDAD: Yo soy (principalmente) un programador de Java yo mismo) – atas

12

En Java, no se puede, como foreach estaba destinado a ocultar el iterador. Debes hacer el ciclo For normal para obtener la iteración actual.

11

Mantenga un registro de su índice: así es como se hace en Java:

int index = 0; 
    for (Element song: question){ 
     // Do whatever 
     index++; 
    } 
+1

Eso es cierto, pero a pesar de que me encanta el bucle mejorado para cada uno introducido en Java5, ¿el hecho de no proporcionar su propio índice derrota el propósito de simplemente usar el tradicional para cada construcción? El uso de lo que está incorporado en Java a menudo será más intuitivo/legible (aunque no siempre) para el desarrollador de Java. –

+1

7 años después ... (wow no lo puedo creer, el tiempo vuela), estoy de acuerdo contigo @MichaelM 100%. –

6

No es posible en Java.


Aquí es la forma en Scala:

val m = List(5, 4, 2, 89) 

for((el, i) <- m.zipWithIndex) 
    println(el +" "+ i) 
+0

¡Aseado! Ver también https://stackoverflow.com/questions/7167253/is-there-a-java-equivalent-of-pythons-enumerate-function –

1

Como otros señalaron, 'no es posible directamente'. Supongo que quieres algún tipo de clave de índice para la canción? Simplemente crea otro campo (una variable miembro) en Element. Increméntelo cuando agregue la canción a la colección.

21
for (Song s: songList){ 
    System.out.println(s + "," + songList.indexOf(s); 
} 

es posible en la lista vinculada.

usted tiene que hacer toString() en la clase de canto. si no lo hace, imprimirá la referencia de la canción.

probablemente irrelevante para usted por ahora.^_^

+0

¡increíble! buena idea –

+9

Ugly hack ...... – Pacerier

+40

Como la gente comentó en http://stackoverflow.com/a/5200217, esto está mal si hay elementos duplicados y es O (n²) lento. –

-3

Ejemplo de código actual que estoy trabajando:

int index=-1; 
for (Policy rule : rules) 
{ 
    index++; 
    // do stuff here 
} 

Le permite limpiamente comienza con un índice de cero, y el incremento mientras procesa.

+0

Simplemente engorroso. Comience en cero e implemente al final. A menos que use continue en el cuerpo del bucle. – gabor

Cuestiones relacionadas