2009-11-30 12 views
18

cuando uso JDK5, como a continuaciónJava bucle foreach: for (i Entero: lista) {...}

ArrayList<Integer> list = new ArrayList<Integer>(); 
    for (Integer i : list) { 

     //cannot check if already reached last item 

    } 

por el contrario, si sólo tiene que utilizar un Iterator

ArrayList<Integer> list = new ArrayList<Integer>(); 
    for (Iterator i = list.iterator(); i.hasNext();) { 

      //i can check whether this is last item 
      if(i.hasNextItem()){ 
      } 

    } 

Cómo puedo comprobar si ya he alcanzado el pasado elemento con for (Integer i : list) {

Respuesta

36

una forma de hacerlo es utilizar un contador:

ArrayList<Integer> list = new ArrayList<Integer>(); 
... 
int size = list.size(); 
for (Integer i : list) { 
    ... 
    if (--size == 0) { 
     // Last item. 
     ... 
    } 
} 

Edición

De todos modos, como dijo Tom Hawtin, a veces es mejor utilizar la sintaxis "viejo" cuando se necesita para obtener la información de índice actual, mediante el uso de un bucle for o la iterator, ya que todo se gana cuando se utiliza la sintaxis Java5 se perderán en el circuito en sí ...

for (int i = 0; i < list.size(); i++) { 
    ... 

    if (i == (list.size() - 1)) { 
     // Last item... 
    } 
} 

o

for (Iterator it = list.iterator(); it.hasNext();) { 
    ... 

    if (!it.hasNext()) { 
     // Last item... 
    } 
} 
+1

no debería ser tan it.hasNext() para determinar la última entrada? –

+0

Tienes toda la razón. Editado ¡Gracias! – romaintaz

+0

Y 'i == list.size() - 1' en el otro ejemplo (los iteradores son generalmente más fáciles de obtener a la derecha que los índices, aunque la sintaxis es un poco larga). –

10

A veces es mejor usar un iterador.

(Supuestamente, "85%" de las solicitudes de un índice en el elegante bucle for es para implementar un String unen método (que se puede hacer fácilmente sin).)

+3

O que puede hacer con Apache commons StringUtils.join;) – phtrivier

+0

phtrivier: Si ya depende de Apache Commons Lang. No introduciría una dependencia solo por eso. –

+0

@Tom - Todavía hay una buena unión antigua ** hack ** que funciona con expresiones: 'String join =" x "; StringBuilder buf = new StringBuilder(); para (Entero i: x) buf.append (i) .append (join); String result = buf.substring (0, buf.length() - join.length()); ' –

4

La API no admite que directa . Usted puede utilizar el for (int i ..) bucle y recuento los elementos o utilizar sublistas (0, tamaño - 1) y manejar el último elemento de forma explícita:

if(x.isEmpty()) return; 
    int last = x.size() - 1; 
    for(Integer i : x.subList(0, last)) out.println(i); 
    out.println("last " + x.get(last)); 

Esto sólo es útil si no introduce redundancia. Es tiene un mejor rendimiento que la versión de conteo (después de amortizar la tara subList). (Por si acaso te importa el boxeo de todos modos).

+0

Bien, pero debe agregar un control de que la lista tiene al menos un elemento (o potencialmente, no está vacío). –

+0

Oh sí, lo agregaré. –

3

Otra manera, se puede utilizar un objeto de traspaso para capturar el último valor y luego hacer algo con él:

List<Integer> list = new ArrayList<Integer>(); 
Integer lastValue = null; 
for (Integer i : list) { 
    // do stuff 
    lastValue = i; 
} 
// do stuff with last value 
+1

Creo que quiere hacer un tratamiento específico dentro del ciclo cuando alcanza el último elemento, sin obtener el último número entero de la lista. Para eso, también puedes hacer 'list.get (list.size() - 1);' – romaintaz

+0

Entiendo, sin embargo, estoy mostrando aquí la idea general de capturar el último objeto. La pregunta es un tanto vaga en el sentido de que realmente no dice lo que quiere hacer, sino cómo lo quiere hacer. – Esko