2011-04-18 12 views
38

¿Existe alguna manera elegante de omitir la primera iteración en un ciclo forense Java5?java foreach omita la primera iteración

Ejemplo pseudo-código:

for (Car car : cars) {  
    //skip if first, do work for rest 
    . 
    . 
} 
+4

Como referencia, Java5 no ha sido "nueva" durante 5-6 años. – cHao

+0

Sospecho que esto es algo que el bucle foreach expresamente no estaba destinado a manejar. – Doug

+0

Supongo que debería haber dicho * más nuevo *: P –

Respuesta

48

Yo no diría que es elegante, pero tal vez mejor que usar un "primer" booleano:

for (Car car : cars.subList(1, cars.size())) 
{ 
    . 
    . 
} 

Aparte de eso, probablemente hay un método elegante .  

+0

Obviamente, esto solo funciona si tiene una lista :) –

+0

¿No todos los tipos y matrices de ordenación tienen un comando de tipo "subconjunto"? – RHSeeger

+0

@RHSeeger No, no lo creo. Quiero decir, lo único que hace que una lista sea una lista es el hecho de que está ordenada, entonces, ¿cómo podría especificar los límites de un subconjunto de una colección desordenada? Supongo que podría omitir la primera iteración de un iterador, pero no habría garantía de que omita siempre el mismo primer elemento. –

1

Elegant? Realmente no. Debería verificar/establecer un booleano.

El bucle for-each es para todos los fines prácticos una sintaxis elegante para usar un iterador. Es mejor que solo uses un iterador y avances antes de comenzar tu ciclo.

3

No soy una persona de Java, pero se puede utilizar:

for (Car car : cars.tail()) de java.util través Groovy JDK

+0

¿Asume que los autos son una lista? –

24
for (Car car : cars) 
{ 
    if (car == cars[0]) continue; 
    ... 
} 

lo suficientemente elegante para mí.

+0

Me parece más claro de esta manera ... ¿y presumiblemente mucho más rápido en una gran lista? – noelicus

+1

A menos que se repita un elemento, pero +1 por elegancia. – borjab

+0

¡Voto este por la mejor respuesta! :-) –

15

código de Seana tiene un pequeño error: el segundo argumento de lista secundaria es tratado como un índice exclusivo, por lo que sólo puede escribir

for (Car car : cars.subList(1, cars.size()) { 
    ... 
} 

(que no parecen ser capaces de hacer comentarios sobre las respuestas, por lo tanto, . la nueva respuesta ¿necesito una cierta reputación de hacer eso)  

+2

Es posible que necesite más rep - buena captura. –

+2

Ahora debería poder [comentar] (http://stackoverflow.com/privileges/comment). – Ishtar

+1

Gracias! Respuesta actualizada –

6

me llegó un poco tarde para esto, pero se puede usar un método de ayuda, algo así como:?

public static <T> Iterable<T> skipFirst(final Iterable<T> c) { 
    return new Iterable<T>() { 
     @Override public Iterator<T> iterator() { 
      Iterator<T> i = c.iterator(); 
      i.next(); 
      return i; 
     } 
    }; 
} 

Y utilizarlo algo como esto:

public static void main(String[] args) { 
    Collection<Integer> c = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); 
    for (Integer n : skipFirst(c)) { 
     System.out.println(n); 
    } 
} 

Generalizando para saltar "n" se deja como ejercicio para el lector :)


EDITAR: En una inspección más cercana, veo que la guayaba tiene un Iterables.skip(...)here.

22

Usa la guayaba Iterables.skip().

Algo así como:

for (Car car : Iterables.skip(cars, 1)) {  
    // 1st element will be skipped 
} 

(conseguimos esto desde el final de msandiford's answer y quería que sea una respuesta independiente)

+1

Me gusta este enfoque, bastante limpio. Gracias –

1

No tan elegante, pero trabajar con iteradores

Iterator<XXXXX> rows = array.iterator(); 
if (rows.hasNext()){ 
    rows.next(); 
} 
for (; rows.hasNext();) { 
    XXXXX row = (XXXXX) rows.next(); 
} 
28

Con nuevo Java 8 Stream API realmente se vuelve muy elegante.Sólo tiene que utilizar skip() método:

cars.stream().skip(1) // and then operations on remaining cars 
0

Esto podría no ser elegante, pero se podría inicializar una variable entera fuera del bucle y se incrementará con cada iteración dentro del bucle. Su programa sólo se ejecuta si el contador es mayor que 0.

int counter = 0; 
for (Car car : cars) { 
    //skip if first, do work for rest 
    if(counter>0){ 
     //do something 
    } 
    counter++; 
} 
Cuestiones relacionadas