Existe-t-il un moyen de déterminer si la boucle est itérée pour la dernière fois? Mon code ressemble à ceci:
int[] array = {1, 2, 3...};
StringBuilder builder = new StringBuilder();
for(int i : array)
{
builder.append("" + i);
if(!lastiteration)
builder.append(",");
}
Maintenant, le problème est que je ne veux pas ajouter de virgule dans la dernière itération. Existe-t-il maintenant un moyen de déterminer si c'est la dernière itération ou si je suis coincé avec la boucle for ou si j'utilise un compteur externe pour garder une trace.
java
for-loop
foreach
conditional-execution
Mercurieux
la source
la source
Réponses:
Une autre alternative consiste à ajouter la virgule avant d'ajouter i, mais pas lors de la première itération. (Veuillez ne pas utiliser
"" + i
, au fait - vous ne voulez pas vraiment de concaténation ici, et StringBuilder a une surcharge d'ajout (int) parfaitement bonne.)La bonne chose à ce sujet est que cela fonctionnera avec n'importe lequel
Iterable
- vous ne pouvez pas toujours indexer les choses. (Le "ajouter la virgule puis la supprimer à la fin" est une bonne suggestion lorsque vous utilisez vraiment StringBuilder - mais cela ne fonctionne pas pour des choses comme l'écriture dans des flux. C'est probablement la meilleure approche pour ce problème précis. )la source
isFirst
indicateur booléen. Bonus: plus rapide aussi.Une autre façon de procéder:
Mise à jour: pour Java 8, vous disposez désormais de collecteurs
la source
Il peut être plus facile de toujours ajouter. Et puis, lorsque vous avez terminé votre boucle, supprimez simplement le caractère final. Des tonnes moins conditionnelles de cette façon aussi.
Vous pouvez utiliser
StringBuilder
desdeleteCharAt(int index)
avec l'index étantlength() - 1
la source
Peut-être que vous utilisez le mauvais outil pour le travail.
C'est plus manuel que ce que vous faites mais c'est en quelque sorte plus élégant sinon un peu "old school"
la source
C'est presque une répétition de cette question StackOverflow . Ce que vous voulez, c'est StringUtils et appeler la méthode de jointure .
la source
Une autre solution (peut-être la plus efficace)
la source
restez simple et utilisez une boucle for standard:
ou utilisez simplement apache commons-lang StringUtils.join ()
la source
Les boucles explicites fonctionnent toujours mieux que les boucles implicites.
Vous devriez envelopper le tout dans une instruction if juste au cas où vous auriez affaire à un tableau de longueur nulle.
la source
Si vous le convertissez en une boucle d'index classique, oui.
Ou vous pouvez simplement supprimer la dernière virgule après avoir terminé. Ainsi:
Moi, j'utilise juste
StringUtils.join()
de commons-lang .la source
Vous avez besoin d'un séparateur de classe .
La mise en œuvre de la classe
Separator
est simple. Il encapsule une chaîne qui est retournée à chaque appel de, à l'toString()
exception du premier appel, qui renvoie une chaîne vide.la source
Basé sur java.util.AbstractCollection.toString (), il se termine tôt pour éviter le délimiteur.
C'est efficace et élégant, mais pas aussi évident que certaines des autres réponses.
la source
(! i.hasNext())
, qui est un élément important de la robustesse de l'approche globale. (Les autres solutions ici gèrent les collections vides avec élégance, donc la vôtre devrait aussi! :)Voici une solution:
Recherchez la première itération :)
la source
Comme la boîte à outils l'a mentionné, dans Java 8, nous avons maintenant des collecteurs . Voici à quoi ressemblerait le code:
Je pense que cela fait exactement ce que vous recherchez, et c'est un modèle que vous pourriez utiliser pour beaucoup d'autres choses.
la source
Encore une autre option.
la source
Bon nombre des solutions décrites ici sont un peu exagérées, à mon humble avis, en particulier celles qui reposent sur des bibliothèques externes. Il existe une belle expression propre et claire pour créer une liste séparée par des virgules que j'ai toujours utilisée. Il repose sur l'opérateur conditionnel (?):
Edit : Solution d'origine correcte, mais non optimale selon les commentaires. Essayer une deuxième fois:
Voilà, en 4 lignes de code comprenant la déclaration du tableau et le StringBuilder.
la source
Voici un benchmark SSCCE que j'ai exécuté (lié à ce que je devais implémenter) avec ces résultats:
Sur mon exemple au moins, sauter le contrôle à chaque itération est pas sensiblement plus rapide en particulier pour les volumes sains de données, mais il est plus rapide.
la source
Une autre approche consiste à stocker la longueur du tableau (si disponible) dans une variable distincte (plus efficace que de revérifier la longueur à chaque fois). Vous pouvez ensuite comparer votre index à cette longueur pour déterminer s'il faut ou non ajouter la virgule finale.
EDIT: Une autre considération est de peser le coût de performance de la suppression d'un caractère final (qui peut provoquer une copie de chaîne) par rapport à la vérification d'un conditionnel à chaque itération.
la source
Si vous ne transformez un tableau qu'en un tableau délimité par des virgules, de nombreux langages ont une fonction de jointure pour exactement cela. Il transforme un tableau en une chaîne avec un délimiteur entre chaque élément.
la source
Dans ce cas, il n'est vraiment pas nécessaire de savoir s'il s'agit de la dernière répétition. Il existe de nombreuses façons de résoudre ce problème. Une solution serait:
la source
Deux chemins alternatifs ici:
1: Utils de chaîne Apache Commons
2: Gardez un booléen appelé
first
, défini sur true. Dans chaque itération, sifirst
est faux, ajoutez votre virgule; après cela, définissezfirst
sur false.la source
Puisqu'il s'agit d'un tableau fixe, il serait plus facile d'éviter simplement le pour ... Si l'objet est une collection, un itérateur serait plus facile.
la source