2009-11-30 4 views
18

utiliser JDK5 comme ci-dessousJava boucle foreach: pour (i entier: liste) {...} Quand je

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

     //cannot check if already reached last item 

    } 

d'autre part si je viens d'utiliser 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 je l'ai déjà atteint dernier point avec for (Integer i : list) {

Répondre

36

une façon de le faire est d'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 Tom Hawtin dit, il est parfois préférable d'utiliser la syntaxe « ancienne » quand vous avez besoin pour obtenir les informations d'index en cours, en utilisant une boucle for ou iterator, comme tout vous gagnez lorsque vous utilisez la syntaxe Java5 sera perdue 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... 
    } 
} 
+1

Si pas être it.hasNext() pour déterminer la dernière entrée? –

+0

Vous avez totalement raison. Édité. Merci! – romaintaz

+0

Et 'i == list.size() - 1' dans l'autre exemple (les itérateurs sont généralement plus faciles à obtenir que les index, bien que la syntaxe soit un peu longue). –

10

Parfois, il vaut mieux utiliser un itérateur.

(Prétendument, « 85% » des demandes d'un index dans le chic boucle est mise en œuvre d'une String méthode join (que vous pouvez facilement faire sans).)

+3

Ou que vous pouvez faire avec apache commons StringUtils.join;) – phtrivier

+0

phtrivier: Si vous êtes déjà dépendant d'Apache Commons Lang. Je ne voudrais pas introduire une dépendance juste pour ça. –

+0

@Tom - Il y a toujours une bonne vieille jointure ** hack ** qui fonctionne avec pour les expressions: 'String join =" x "; StringBuilder buf = nouveau StringBuilder(); pour (Integer i: x) buf.append (i) .append (join); Chaîne résultat = buf.substring (0, buf.length() - join.length()); ' –

4

L'API ne supporte pas directement . Vous pouvez utiliser le for (int i ..) boucle et nombre les éléments ou utilisez (0, sous-listes taille - 1) et de gérer le dernier élément explicitement:

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

Cela n'est utile que si elle n'introduit pas de redondance. Il fonctionne mieux que la version de comptage (après que le surcoût de sous-liste est amorti). (Juste au cas où vous vous souciez de la boxe de toute façon).

+0

Nice, mais vous devez ajouter une vérification que la liste a au moins un élément (ou potentiellement, n'est pas vide). –

+0

Oh oui, je vais ajouter ça. –

3

Une autre façon, vous pouvez utiliser un objet de passage pour capturer la dernière valeur et faire quelque chose avec elle:

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

Je pense qu'il veut faire un traitement spécifique à l'intérieur de la boucle lorsqu'il atteint le dernier élément, sans avoir le dernier entier de la liste. Pour cela, vous pouvez aussi faire 'list.get (list.size() - 1);' – romaintaz

+0

Je comprends, cependant je montre ici l'idée générale de capturer le dernier objet. La question est un peu vague en ce sens qu'il ne dit pas vraiment ce qu'il veut faire, juste comment il veut le faire. – Esko