2011-10-07 13 views
29

¿Es posible encontrar el índice presente en un bucle forzado mejorado? ¿Si es así, cómo?¿Es posible encontrar el índice presente en un bucle for mejorado?

Soy consciente de que podemos verificarlo con una variable adicional. Pero hay alguna otra manera.

public boolean cancelTicket(Flight f, Customer c) { 
    List<BookingDetails> l = c.getBooking(); 
    if (l.size() < 0) { 
     return false; 
    } else { 
     for (BookingDetails bd : l) { 
      if(bd.getFlight()==f){ 
       l.remove() // Index here.. 
      } 
     } 
    } 
} 
+6

Esto no tiene ningún sentido: 'if (list.size() <0)'. ¿Tal vez quisiste decir '==' en su lugar? –

+1

Compruebe esto. http://stackoverflow.com/questions/1196586/calling-remove-in-foreach-loop-in-java – Vaandu

+3

Incluso si tenía el índice, intentando eliminar el elemento de la lista de una forma mejorada para loop causaría una ConcurrentModificationException. Use un iterador como lo sugiere @aioobe –

Respuesta

30

¿Es posible encontrar el índice actual en un bucle for mejorado?

No. Si se necesita el índice, le sugiero que utilice una corriente de bucle.

Sin embargo, en realidad no parece necesitar el índice en esta situación. A menos que usted está tratando con algunos realmente extraño tipo de lista, usted podría ir con un Iterator y utiliza el método Iterator.remove(), así:

public boolean cancelTicket(Flight f, Customer c) { 
    Iterator<BookingDetails> bdIter = c.getBooking().iterator(); 

    if (!bdIter.hasNext()) 
     return false; 

    while (bdIter.hasNext()) 
     if (bdIter.next().getFlight() == f) 
      bdIter.remove(); 

    return true; 
} 
+5

"No necesita el índice para la operación de eliminación en esta situación particular, sin embargo" - además, * no * puede usar el índice para la operación de eliminación, porque si lo hace, usted obtendrá una 'ConcurrentModificationException'. Como dice aioobe, la forma correcta de hacerlo es con 'Iterator.remove()'. –

+0

¡Buen punto! :-) – aioobe

9

¿Es posible encontrar el índice actual en una mejorada ¿en bucle?

Para obtener el índice, puede utilizar List.indexOf(object).

He utilizado estas técnicas para obtener el índice del objeto actual en una lista. Por ejemplo, dado anteriormente, la eliminación se puede hacer de dos maneras.

  • Utilizando la instancia objeto para eliminar el objeto.
public boolean cancelTicket(Flight f, Customer c) { 
     List<BookingDetails> l = c.getBooking(); 
     if (l.size() < 0) { 
      return false; 
     } else { 
      for (BookingDetails bd : l) { 
       if(bd.getFlight()==f){ 
        l.remove(bd) // Object Instance here.. 
       } 
      } 
     } 
    } 
  • Usando List.indexOf (índice)
public boolean cancelTicket(Flight f, Customer c) { 
     List<BookingDetails> l = c.getBooking(); 
     if (l.size() < 0) { 
      return false; 
     } else { 
      for (BookingDetails bd : l) { 
       if(bd.getFlight()==f){ 
        l.remove(l.indexOf(bd)) // index Number here.. 
       } 
      } 
     } 
    } 
+8

List.indexOf es O (n) así que trato de evitar usarlo en general. – user393274

+3

Además, indexOf siempre devuelve la primera aparición del objeto en la lista, que puede no ser la que desea. – IrishDubGuy

7

Sí, utilizar un contador antes de la sentencia for. como tal:

int i = 0; 
for (int s : ss) 
{ 
    // Some Code 
    System.out.println(i); 

    i++; 
} 
+1

La mejor y más eficiente respuesta ;-) – BullyWiiPlaza

Cuestiones relacionadas