La dernière itération de renforcement de la boucle for en java
Est-il un moyen de déterminer si la boucle est une itération 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 truc c'est que je ne veux pas ajouter de la virgule dans la dernière itération. Maintenant, est-il un moyen pour déterminer si elle est la dernière itération ou suis-je coincé avec la boucle for ou à l'aide d'un compteur de garder une trace.
- Ouais! C'est drôle, je voulais juste poser exactement la même question!
- Le même genre de question revient (et seront). Maintenant, pourquoi voudriez-vous pour créer une boucle, si un élément a besoin d'un traitement différent? stackoverflow.com/questions/156650/...
- Puisque vous avez un tableau fixe pourquoi utiliser l'interface pour? for(int i = 0; i< tableau.longueur; i++ if(i < tableau.lenth),,,
Vous devez vous connecter pour publier un commentaire.
Une autre alternative est d'ajouter la virgule avant d'ajouter que j', tout simplement pas sur le première itération. (Merci de ne pas utiliser
"" + i
, en passant, vous n'avez pas vraiment envie de concaténation ici, et StringBuilder a un parfaitement bon append(int) surcharge.)La bonne chose à ce sujet est qu'il fonctionne avec n'importe quel
Iterable
- vous ne pouvez pas toujours l'indice de choses. ("Ajouter la virgule, puis l'enlever à la fin" est une suggestion intéressante lorsque vous êtes vraiment en utilisant StringBuilder - mais il ne fonctionne pas pour des choses comme l'écriture des ruisseaux. C'est peut-être la meilleure approche à ce problème exact, cependant).Class Separator
réponse.isFirst
indicateur booléen. Bonus: plus rapide aussi.Un autre moyen de le faire:
Mise à jour: Pour Java 8, vous avez maintenant Les collectionneurs
Il pourrait être plus facile de toujours ajouter. Et puis, quand vous en avez terminé avec votre boucle, il suffit de retirer le caractère final. Des tonnes de moins en moins les conditions de cette façon aussi.
Vous pouvez utiliser
StringBuilder
'sdeleteCharAt(int index)
avec indice delength() - 1
Peut-être que vous utilisez le mauvais outil pour le Travail.
C'est plus manuel que ce que vous faites, mais c'est plus élégant si pas un peu "vieille école"
C'est presque une répétition de cette question StackOverflow. Ce que vous voulez est StringUtils, et d'appeler le rejoindre méthode.
Une autre solution (peut-être le plus efficace)
Explicite boucles fonctionnent toujours mieux qu'implicitement.
Vous devez envelopper le tout dans un if seulement dans le cas où vous faites affaire avec un zéro-longueur du tableau.
faire simple et utiliser une boucle for:
ou tout simplement l'utilisation d'apache commons-lang StringUtils.join()
Si vous le convertissez en un classique de l'indice de boucle, oui.
Ou vous pouvez simplement supprimer la dernière virgule après c'est fait. Comme:
Moi, je viens d'utiliser
StringUtils.join()
de commons-lang.Vous avez besoin Classe Séparateur.
La mise en œuvre de la classe
Separator
est simple. Il enroule une chaîne est renvoyée à chaque appel detoString()
sauf pour le premier appel, qui retourne une chaîne vide.Basé sur java.util.AbstractCollection.toString(), il quitte tôt pour éviter le délimiteur.
C'est efficace et élégant, mais pas aussi évident que certains des autres réponses.
(! i.hasNext())
, qui est une partie importante de la robustesse de l'approche globale. (Les autres solutions ici poignée de collections vide gracieusement, de sorte que la vôtre, ce qui devrait aussi! 🙂Voici une solution:
Regarder pour la première itération 🙂
Encore une autre option.
Beaucoup de solutions décrites ici sont un peu plus haut, à mon humble avis, notamment ceux qui s'appuient sur les bibliothèques externes. Il est agréable et très propre, clair idiome pour la réalisation d'une liste séparée par des virgules que j'ai toujours utilisé. Il s'appuie sur le conditionnel (?) opérateur:
Modifier: La solution correcte, mais non optimale en fonction des commentaires. Essayer une seconde fois:
Là vous allez, en 4 lignes de code, y compris la déclaration de la matrice et le StringBuilder.
Voici un SSCCE de référence, j'ai couru (liées à ce que j'avais à mettre en œuvre) avec ces résultats:
Sur mon exemple au moins, en sautant la case à chaque itération n'est pas sensiblement plus rapide, surtout pour sane volumes de données, mais il est plus rapide.
Comme trousse à outils mentionnés, dans Java 8, nous avons maintenant Les collectionneurs. Voici ce que le code devrait ressembler à:
Je pense que c'est exactement ce que vous cherchez, et c'est un motif que vous pourriez utiliser pour beaucoup d'autres choses.
Une autre approche est d'avoir la longueur du tableau (si disponible) stockée dans une variable distincte (plus efficace que de la re-vérification de la longueur à chaque fois). Vous pouvez ensuite comparer votre indice de cette longueur pour déterminer si ou de ne pas ajouter la virgule finale.
EDIT: une Autre considération est de pesage de la performance coût de la suppression d'un caractère final (ce qui peut causer une copie de chaîne) contre d'avoir un conditionnel être vérifié à chaque itération.
Si vous êtes seulement à transformer un tableau en une délimité par des virgules, de tableau, de nombreuses langues ont une fonction join pour exactement cela. Il tourne d'un tableau en une chaîne de caractères avec un séparateur entre chaque élément.
Dans ce cas, il n'y a vraiment pas besoin de savoir si c'est la dernière répétition.
Il existe de nombreuses façons que nous pouvons résoudre ce problème. Un autre moyen serait:
Deux chemins alternatifs ici:
1: Apache Commons Chaîne Utils
2: Conserver à une valeur booléenne appelée
first
, affectez la valeur true. Dans chaque itération, sifirst
est faux, ajouter votre virgule; après cela, définissezfirst
à false.Depuis son un tableau fixe, il serait plus facile d'éviter ces renforcée pour... Si l'Objet est une collection d'un itérateur serait plus facile.