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