java foreach pomiń pierwszą iterację

Czy istnieje elegancki sposób na pominięcie pierwszej iteracji w pętli Java5 foreach ?

Przykładowy pseudo-kod:

for ( Car car : cars ) {     
   //skip if first, do work for rest
   .
   .
}
Author: Alex, 2011-04-19

10 answers

Nie nazwałbym tego eleganckim, ale może lepiej niż używanie" pierwszego " boolean:

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

Poza tym, prawdopodobnie żadna elegancka metoda.  

 53
Author: Sean Adkinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-26 09:30:09

Z nowym Java 8 Stream API staje się bardzo eleganckie. Wystarczy użyć metody skip():

cars.stream().skip(1) // and then operations on remaining cars
 37
Author: Kao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-02 11:06:46

Użyj Guawy Iterables.skip().

Coś w stylu:

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

(dostałem to od końca odpowiedzi msandiforda i chciałem zrobić z tego samodzielną odpowiedź)

 27
Author: yop83,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:25
for (Car car : cars)
{
   if (car == cars[0]) continue;
   ...
}
Dla mnie wystarczająco Elegancka.
 24
Author: elekwent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-19 00:14:17

Kod Seany ma mały błąd: drugi argument do sublist jest traktowany jako indeks Wyłączny, więc możemy po prostu napisać

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

(wydaje mi się, że nie jestem w stanie skomentować odpowiedzi, stąd Nowa odpowiedź. Czy potrzebuję do tego pewnej reputacji?)  

 17
Author: Daniel Lubarov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-26 09:29:45

Trochę się na to spóźniłem, ale przydałaby się pomocna metoda, coś w stylu:

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;
        }
    };
}

I użyj czegoś takiego:

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);
    }
}

Uogólnienie na pominięcie "n" jest pozostawione jako ćwiczenie dla czytelnika:)


EDIT: po bliższym przyjrzeniu się widzę, że guawa ma Iterables.skip(...) tutaj .

 6
Author: msandiford,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-21 22:44:24

Nie jestem osobą Javy, ale można użyć:

for ( Car car : cars.tail() ) z Javy.util via Groovy JDK

 3
Author: Preet Sangha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-18 23:52:07

Elegancki? Nie bardzo. Musisz sprawdzić / ustawić wartość logiczną.

Pętla for-each jest dla wszystkich praktycznych celów wymyślną składnią używającą iteratora. Lepiej po prostu użyć iteratora i posunąć się do przodu, zanim zaczniesz pętlę.

 1
Author: Brian Roach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-18 23:47:39

Nie tak eleganckie, ale praca z iteratorami

Iterator<XXXXX> rows = array.iterator();
if (rows.hasNext()){
    rows.next();
}
for (; rows.hasNext();) {
    XXXXX row = (XXXXX) rows.next();
}
 1
Author: Angel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-03 18:27:14

Może to nie być eleganckie, ale można zainicjować zmienną całkowitą poza pętlą for i zwiększyć ją przy każdej iteracji wewnątrz pętli. Twój program uruchomi się tylko wtedy, gdy licznik jest większy niż 0.

int counter = 0;
for ( Car car : cars ) {
    //skip if first, do work for rest
    if(counter>0){
        //do something
    }
    counter++;
}
 1
Author: Benjamin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-17 09:34:57