web-dev-qa-db-fra.com

Java foreach loop: for (Integer i: list) {...}

Quand j'utilise JDK5 comme ci-dessous

ArrayList<Integer> list = new ArrayList<Integer>();  
     for (Integer i : list) { 

      //cannot check if already reached last item

   }

d'autre part si j'utilise simplement un Iterator

ArrayList<Integer> list = new ArrayList<Integer>();
  for (Iterator i = list.iterator(); i.hasNext();) {

          //i can check whether this is last item
          if(i.hasNextItem()){
          }

    }

Comment puis-je vérifier si j'ai déjà atteint le dernier élément avec for (Integer i : list) {

19
cometta

Pour ce faire, vous pouvez utiliser un compteur:

ArrayList<Integer> list = new ArrayList<Integer>();
...
int size = list.size();
for (Integer i : list) { 
    ...
    if (--size == 0) {
        // Last item.
        ...
    }
}

Modifier

Quoi qu'il en soit, comme l'a dit Tom Hawtin, il est parfois préférable d'utiliser la "vieille" syntaxe lorsque vous avez besoin d'obtenir les informations d'index actuelles, en utilisant une boucle for ou la iterator, comme tout ce que vous gagner lors de l'utilisation de la syntaxe Java5 sera perdu dans la boucle elle-même ...

for (int i = 0; i < list.size(); i++) {
    ...

    if (i == (list.size() - 1)) {
        // Last item...
    }
}

ou

for (Iterator it = list.iterator(); it.hasNext(); ) {
    ...

    if (!it.hasNext()) {
        // Last item...
    }
}
36
Romain Linsolas

Parfois, il est préférable d'utiliser un itérateur.

(Apparemment, "85%" des demandes d'index dans la boucle chic est pour implémenter une méthode de jointure String (dont vous pouvez facilement vous passer).)

9

L'API ne prend pas cela directement en charge. Vous pouvez utiliser la boucle for (int i ..) et count les éléments ou utiliser subLists (0, size - 1) et gérer explicitement le dernier élément:

  if(x.isEmpty()) return;
  int last = x.size() - 1;
  for(Integer i : x.subList(0, last)) out.println(i);
  out.println("last " + x.get(last));

Ceci n'est utile que s'il n'introduit pas de redondance. Il fonctionne mieux que la version de comptage (après amortissement de la surcharge de sous-liste). (Juste au cas où vous vous soucieriez de la boxe de toute façon).

4
Thomas Jung

Vous pouvez également utiliser un objet d'intercommunication pour capturer la dernière valeur, puis faire quelque chose avec:

List<Integer> list = new ArrayList<Integer>();
Integer lastValue = null;
for (Integer i : list) {
    // do stuff
    lastValue = i;
}
// do stuff with last value
3
Esko