web-dev-qa-db-fra.com

détecter la dernière itération de boucle foreach

En supposant que j'ai une boucle foreach comme celle-ci:

Set<String> names = new HashSet<>();

//some code

for (String name: names) {

     //some code

}

Existe-t-il un moyen de vérifier dans foreach que le nom réel est le dernier de Set sans compteur? 

(Désolé si c'est une question dupliquée, je n'ai pas trouvé ici une question comme celle-ci)

18
mhery

Il n'y en a pas, jetez un oeil à Comment fonctionne la boucle Java 'for each'?

Vous devez changer votre boucle pour utiliser un itérateur explicitement ou un compteur int.

11
Lazar Petrovic

Pour la simplicité et la compréhensibilité, imo, ferait:

Set<String> names = new HashSet<>();
Iterator<String> iterator = names.iterator();
    while (iterator.hasNext()) {
        String name = iterator.next();
        //Do stuff
        if (!iterator.hasNext()) {
            //last name 
        }
     }

En outre, cela dépend de ce que vous essayez d’atteindre. Supposons que vous implémentez le cas d'utilisation courant consistant à séparer chaque nom par un virgule, sans ajouter de virgule à la fin:

Set<String> names = new HashSet<>();
names.add("Joao");
names.add("Pereira");

//if the result should be Joao, Pereira then something like this may work
String result = names.stream().collect(Collectors.joining(", "));
10
Joao Pereira

Les autres réponses sont tout à fait adéquates, il suffit d’ajouter cette solution à la question donnée.

Set<String> names = new HashSet<>();

   //some code
   int i = 0;

for (String name: names) {
    if(i++ == names.size() - 1){
        // Last iteration
    }
   //some code

}
8
Edu G

.map (String :: toString) de la réponse ci-dessus est redondant, car HashSet contient déjà des valeurs String. N'utilisez pas Set pour concaténer des chaînes car l'ordre n'est pas assuré.

List<String> nameList = Arrays.asList("Michael", "Kate", "Tom");
String result = nameList.stream().collect(Collectors.joining(", "));
0
luk4

Il n'y a pas de méthode de construction permettant de vérifier si l'élément en cours est également le dernier élément. De plus, vous utilisez une variable HashSet qui ne garantit pas la commande de retour. Même si vous voulez le vérifier, par exemple avec un index i, le dernier élément peut toujours être différent. 

0
Murat Karagöz

Un Set ne garantit pas l'ordre des éléments qu'il contient. Vous pouvez parcourir la Set une fois et récupérer "abc" en tant que "dernier élément" et la prochaine fois, vous constaterez que "hij" est le "dernier élément" de la Set

Cela étant dit, si vous n'êtes pas préoccupé par l'ordre et que vous voulez simplement savoir quel est le "dernier élément" arbitraire lorsque vous observez la Set à ce moment précis, rien ne permet de le faire. Vous devrez utiliser un compteur.

0
CraigR8806