web-dev-qa-db-fra.com

java foreach ignorer la première itération

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
   .
   .
}
46
Amir Afghani

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 .

57
Sean Adkinson

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
47
Kao

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)

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

Assez élégant pour moi.

26
elekwent

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?)

17
Daniel Lubarov

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 .

6
msandiford

Je ne suis pas une personne Java, mais pouvez-vous utiliser:

for ( Car car : cars.tail() ) à partir de Java.util via Groovy JDK

4
Preet Sangha

É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.

1
Brian Roach

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++;
}
1
Benjamin

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();
}
1
Angel

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++;
    }
0
Sonakshi Sharma

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.

0
Emanuel