2011-10-07 10 views
29

Czy można znaleźć obecny indeks w ulepszonej pętli for? Jeśli tak to jak?Czy można znaleźć obecny indeks w ulepszonej pętli for?

Mam świadomość, że możemy to sprawdzić za pomocą dodatkowej zmiennej. Ale jest jakakolwiek inna droga.

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

To nie ma żadnego sensu: 'if (list.size() <0)'. Może zamiast tego miałeś na myśli '=='? –

+1

Sprawdź to. http://stackoverflow.com/questions/1196586/calling-remove-in-foreach-loop-in-java – Vaandu

+3

Nawet jeśli nie mają indeks, próbując usunąć element z listy w udoskonalona dla pętla spowoduje wyjątek ConcurrentModificationException. Użyj iteratora zgodnie z sugestią @aioobe –

Odpowiedz

30

Czy to możliwe, aby znaleźć obecny indeks udoskonalona dla pętli?

No. Jeśli potrzebujesz indeksu, proponuję użyć zwykłej pętli for.

Jednak w tej sytuacji nie wydaje się, aby indeks był potrzebny. Chyba że masz do czynienia z naprawdę dziwnym rodzaju listy, można przejść z Iterator i użyć metody Iterator.remove(), tak:

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

"Nie potrzebujesz indeksu do operacji usunięcia w tej konkretnej sytuacji" - co więcej, nie możesz * użyć indeksu do operacji usunięcia, ponieważ jeśli to zrobisz, otrzyma 'ConcurrentModificationException'. Jak twierdzi Aioobe, prawidłowym sposobem na to jest użycie 'Iterator.remove()'. –

+0

Dobra uwaga! :-) – aioobe

9

Czy jest możliwe aby znaleźć indeks obecny w rozbudowanym dla pętli?

Dla uzyskania indeksu, można użyć List.indexOf(object).

Użyłem tych technik do uzyskania indeksu bieżącego obiektu na liście. Na przykład podany powyżej, usunięcie można zrobić na dwa sposoby.

  • Użycie instancji obiektu do usunięcia obiektu.
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.. 
       } 
      } 
     } 
    } 
  • Korzystanie List.indexOf (Indeks)
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 to O (n), więc staram się unikać używania go w ogóle. – user393274

+3

Ponadto, indexOf zawsze zwraca pierwsze wystąpienie obiektu na liście, co może nie być tym, czego potrzebujesz. – IrishDubGuy

7

Tak, użyć licznika zanim na rachunku. jako takie:

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

    i++; 
} 
+1

Najlepsza i najbardziej skuteczna odpowiedź ;-) – BullyWiiPlaza