java foreach erste Iteration überspringen

Lesezeit: 3 Minuten

Benutzer-Avatar
Amir Afghani

Gibt es eine elegante Möglichkeit, die erste Iteration in einer Java5-Foreach-Schleife zu überspringen?

Beispiel Pseudocode:

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

  • Als Referenz ist Java5 seit 5-6 Jahren nicht mehr “neu”.

    – chao

    18. April 2011 um 23:46 Uhr

  • Ich vermute, dass dies etwas ist, wofür die foreach-Schleife ausdrücklich nicht vorgesehen war.

    – Owen

    18. April 2011 um 23:47 Uhr

  • Ich schätze, ich hätte sagen sollen neuer 😛

    – Amir Afghani

    18. April 2011 um 23:51 Uhr

Benutzer-Avatar
Sean Adkinson

Ich würde es nicht elegant nennen, aber vielleicht besser als die Verwendung eines “ersten” booleschen Werts:

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

Ansonsten wohl keine elegante Methode.

  • Haben nicht alle geordneten Sammlungstypen und Arrays einen solchen Befehl vom Typ “Teilmenge”?

    – RHSeeger

    19. April 2011 um 0:18 Uhr

  • @RHSeeger Nein, das glaube ich nicht. Ich meine, das Einzige, was eine Liste zu einer Liste macht, ist die Tatsache, dass sie geordnet ist. Wie könnten Sie also die Grenzen einer Teilmenge einer ungeordneten Sammlung angeben? Ich nehme an, Sie könnten die erste Iteration eines Iterators überspringen, aber es gäbe keine Garantie dafür, dass Sie immer dasselbe erste Element überspringen.

    – Sean Adkinson

    19. April 2011 um 1:48 Uhr

  • Es gab auch noch eine Klammer 🙂

    – Bakudan

    18. September 2012 um 9:00 Uhr

Benutzer-Avatar
Kao

Mit neuem Java 8 Stream-API es wird tatsächlich sehr elegant. Benutz einfach skip() Methode:

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

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

Elegant genug für mich.

  • Scheint mir auf diese Weise klarer zu sein … und vermutlich viel schneller auf einer großen Liste?

    – noelikus

    27. April 2013 um 11:08 Uhr

  • Es sei denn, ein Element wird wiederholt, aber +1 für Eleganz.

    – borjab

    4. März 2014 um 12:34 Uhr

  • Ew. Hinzufügen einer unnötigen Bedingung zu jeder Iteration einer Schleife? Nein Danke.

    – Andreas

    24. Januar 2017 um 13:57 Uhr

Benutzer-Avatar
yop83

Verwenden Sie Guave Iterables.skip().

Etwas wie:

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

(Ich habe dies vom Ende von msandifords Antwort erhalten und wollte es zu einer eigenständigen Antwort machen.)

Benutzer-Avatar
Daniel Lubarow

Der Code von SeanA hat einen winzigen Fehler: Das zweite Argument für die Unterliste wird als exklusiver Index behandelt, sodass wir einfach schreiben können

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

(Anscheinend kann ich Antworten nicht kommentieren, daher die neue Antwort. Brauche ich dafür einen bestimmten Ruf?)

  • Sie sollten jetzt kommentieren können.

    – Ischtar

    19. April 2011 um 12:08 Uhr

Ich bin etwas spät dazu gekommen, aber Sie könnten eine Hilfsmethode verwenden, etwa so:

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

Und verwende es etwa so:

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

Das Verallgemeinern zum Überspringen von “n” bleibt dem Leser als Übung überlassen 🙂


BEARBEITEN: Bei näherer Betrachtung sehe ich, dass Guava eine hat Iterables.skip(...) hier.

  • Sie sollten jetzt kommentieren können.

    – Ischtar

    19. April 2011 um 12:08 Uhr

Benutzer-Avatar
Preet-Sangha

Ich bin kein Java-Person, aber können Sie Folgendes verwenden:

for ( Car car : cars.tail() ) von java.util über Grooviges JDK

  • Geht es davon aus, dass die Autos eine Liste sind?

    – Piyush Mattoo

    19. April 2011 um 0:23 Uhr

1176230cookie-checkjava foreach erste Iteration überspringen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy