Existe-t-il un moyen élégant d'ignorer la première itération dans une boucle Java5 foreach?
Exemple de pseudo-code:
for ( Car car : cars ) {
//skip if first, do work for rest
.
.
}
Je ne dirais pas que c'est élégant, mais peut-être mieux que d'utiliser un "premier" booléen:
for ( Car car : cars.subList( 1, cars.size() ) )
{
.
.
}
Autre que cela, probablement pas de méthode élégante .
Avec la nouvelle API Java 8 Stream , il devient très élégant. Utilisez simplement la méthode skip()
:
cars.stream().skip(1) // and then operations on remaining cars
Utilisez Guava Iterables.skip()
.
Quelque chose comme:
for ( Car car : Iterables.skip(cars, 1) ) {
// 1st element will be skipped
}
(Je l'ai depuis la fin de réponse de msandiford et je voulais en faire une réponse autonome)
for (Car car : cars)
{
if (car == cars[0]) continue;
...
}
Assez élégant pour moi.
Le code de SeanA a une petite erreur: le deuxième argument de la sous-liste est traité comme un index exclusif, nous pouvons donc simplement écrire
for (Car car : cars.subList(1, cars.size()) {
...
}
(Je ne semble pas pouvoir commenter les réponses, d'où la nouvelle réponse. Ai-je besoin d'une certaine réputation pour le faire?)
Je suis arrivé un peu tard, mais vous pouvez utiliser une méthode d'assistance, quelque chose comme:
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;
}
};
}
Et utilisez quelque chose comme ça:
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);
}
}
Généraliser pour ignorer "n" reste un exercice pour le lecteur :)
EDIT: En regardant de plus près, je vois que Guava a une Iterables.skip(...)
here .
Je ne suis pas une personne Java, mais pouvez-vous utiliser:
for ( Car car : cars.tail() )
à partir de Java.util via Groovy JDK
Élégant? Pas vraiment. Vous devez vérifier/définir un booléen.
La boucle for-each est à toutes fins pratiques une syntaxe élégante pour utiliser un itérateur. Il vaut mieux utiliser un itérateur et avancer avant de commencer votre boucle.
Cela n’est peut-être pas élégant, mais vous pouvez initialiser une variable entière en dehors de la boucle for et l’incrémenter à chaque itération de la boucle . Votre programme ne s’exécutera que si le compteur est supérieur à 0.
int counter = 0;
for ( Car car : cars ) {
//skip if first, do work for rest
if(counter>0){
//do something
}
counter++;
}
Pas si élégant mais travaille avec des itérateurs
Iterator<XXXXX> rows = array.iterator();
if (rows.hasNext()){
rows.next();
}
for (; rows.hasNext();) {
XXXXX row = (XXXXX) rows.next();
}
Vous pouvez utiliser un compteur. Bien que le codage ne soit pas aussi mature, je trouve néanmoins que le moyen le plus simple d’éviter le premier élément d’une liste.
int ctr=0;
for(Resource child:children) {
if(ctr>0) { //this will skip the first element, i.e. when ctr=0
//do your thing from the 2nd element onwards
}
ctr++;
}
J'ai vu quelques bonnes solutions ici, mais à mon avis, vous devriez éviter cela:
for (Car car : cars)
{
if (car == cars[0]) continue;
...
}
La raison en est que vous avez demandé de sauter juste à la première itération de la boucle, Et cette façon ne fonctionnera que si la voiture qui se trouve dans le premier index de votre conteneur n'y apparaît qu'une fois
Mais que se passe-t-il si cette voiture apparaît plus d’une fois dans le conteneur? Dans ce cas, vous la sauterez à nouveau et vous passerez plus d’itérations à l’exception de la première.