Quelle est la manière la plus claire de délimiter une liste par des virgules en Java?
Je connais plusieurs façons de le faire, mais je me demande quelle est la meilleure façon (où «meilleur» signifie le plus clair et / ou le plus court, pas le plus efficace.
J'ai une liste et je veux faire une boucle dessus, en imprimant chaque valeur. Je veux imprimer une virgule entre chaque élément, mais pas après le dernier (ni avant le premier).
List --> Item ( , Item ) *
List --> ( Item , ) * Item
Exemple de solution 1:
boolean isFirst = true;
for (Item i : list) {
if (isFirst) {
System.out.print(i); // no comma
isFirst = false;
} else {
System.out.print(", "+i); // comma
}
}
Exemple de solution 2 - créer une sous-liste:
if (list.size()>0) {
System.out.print(list.get(0)); // no comma
List theRest = list.subList(1, list.size());
for (Item i : theRest) {
System.out.print(", "+i); // comma
}
}
Exemple de solution 3:
Iterator<Item> i = list.iterator();
if (i.hasNext()) {
System.out.print(i.next());
while (i.hasNext())
System.out.print(", "+i.next());
}
Ceux-ci traitent le premier élément spécialement; on pourrait plutôt traiter le dernier spécialement.
Incidemment, voici comment List
toString
est implémenté (il est hérité de AbstractCollection
), dans Java 1.6:
public String toString() {
Iterator<E> i = iterator();
if (! i.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = i.next();
sb.append(e == this ? "(this Collection)" : e);
if (! i.hasNext())
return sb.append(']').toString();
sb.append(", ");
}
}
Il quitte la boucle tôt pour éviter la virgule après le dernier élément. BTW: c'est la première fois que je me souviens avoir vu "(this Collection)"; voici le code pour le provoquer:
List l = new LinkedList();
l.add(l);
System.out.println(l);
J'accueille toutes les solutions, même si elles utilisent des bibliothèques inattendues (regexp?); et aussi des solutions dans des langages autres que Java (par exemple, je pense que Python / Ruby ont une fonction intercalaire - comment est- ce implémenté?).
Clarification : par bibliothèques, j'entends les bibliothèques Java standard. Pour les autres bibliothèques, je les considère avec d'autres langages et je suis intéressé de savoir comment ils sont implémentés.
EDIT toolkit a mentionné une question similaire: dernière itération de la boucle for améliorée en java
Et un autre: le dernier élément d'une boucle mérite-t-il un traitement séparé?
la source
Réponses:
Java 8 et versions ultérieures
Utilisation de la
StringJoiner
classe:Utilisation
Stream
, etCollectors
:Java 7 et versions antérieures
Voir aussi # 285523
la source
la source
Java 8 propose plusieurs nouvelles façons de procéder:
join
méthode surString
.joining
collecteur pour les flux duCollectors
classe.StringJoiner
classe.Exemple:
L'approche utilisant les flux suppose
import static java.util.stream.Collectors.joining;
.la source
Menuisier .
la source
Si vous utilisez Spring Framework, vous pouvez le faire avec StringUtils :
la source
Basé sur l'implémentation de List toString de Java:
Il utilise une grammaire comme celle-ci:
En étant basé sur le dernier au lieu de basé sur le premier, il peut vérifier les sauts de virgule avec le même test pour vérifier la fin de la liste. Je pense que celui-ci est très élégant, mais je ne suis pas sûr de la clarté.
la source
la source
Il existe un joli moyen d'y parvenir en utilisant Java 8:
la source
la source
Une option pour la boucle foreach est:
la source
Mise à jour : comme Dave Webb l'a mentionné dans les commentaires, cela peut ne pas produire de résultats corrects si les premiers éléments de la liste sont des chaînes vides.
la source
Je fais généralement ceci:
Bien que je pense que je vais procéder à une vérification à partir de maintenant selon l'implémentation Java;)
la source
Si vous pouvez utiliser Groovy (qui s'exécute sur la JVM):
la source
(Copiez-collez ma propre réponse à partir d' ici .) La plupart 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 y a une belle expression propre et claire pour obtenir 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.
2e édition : si vous avez affaire à un itérateur:
la source
J'utilise généralement quelque chose de similaire à la version 3. Cela fonctionne bien c / c ++ / bash / ...: P
la source
Je ne l'ai pas compilé ... mais devrait fonctionner (ou être sur le point de travailler).
la source
C'est très court, très clair, mais donne à ma sensibilité des horreurs rampantes. Il est également un peu difficile de s'adapter à différents délimiteurs, en particulier s'il s'agit d'une chaîne (et non d'un caractère).
Inspiré par: Dernière itération de la boucle for améliorée en java
la source
la source
Item1Item2, Item3, Item4,
J'aime un peu cette approche, que j'ai trouvée sur un blog il y a quelque temps. Malheureusement, je ne me souviens pas du nom / de l'URL du blog.
Vous pouvez créer une classe utilitaire / d'assistance qui ressemble à ceci:
L'utilisation de la classe helper est simple comme ceci:
la source
Étant donné que votre délimiteur est "," vous pouvez utiliser l'un des éléments suivants:
Si votre délimiteur est autre chose, cela ne fonctionnera pas pour vous.
la source
J'aime cette solution:
Je suppose qu'il peut également utiliser StringBuilder.
la source
À mon avis, c'est le plus simple à lire et à comprendre:
la source
En Python, c'est facile
",". rejoindre (votre liste)
En C #, il existe une méthode statique sur la classe String
String.Join (",", votre liste de chaînes)
Désolé, je ne suis pas sûr de Java, mais je pensais que je ferais un commentaire sur les autres langues. Je suis sûr qu'il y aurait quelque chose de similaire en Java.
la source
Vous pouvez également ajouter de manière inconditionnelle la chaîne de délimitation et, après la boucle, supprimer le délimiteur supplémentaire à la fin. Puis un "si la liste est vide alors renvoyer cette chaîne" au début vous permettra d'éviter la vérification à la fin (car vous ne pouvez pas supprimer des caractères d'une liste vide)
La question est donc vraiment:
"Étant donné une boucle et un si, selon vous, quelle est la manière la plus claire de les réunir?"
la source
la source
listToString.substring(0, listToString.length()-separator.length());
Basé sur la manière la plus claire de délimiter une liste par des virgules (Java)?
En utilisant cette idée: le dernier élément d'une boucle mérite-t-il un traitement séparé?
la source
for (int i=0; i<1; i++)
pourif (array.length>0)
.la source
Aucune des réponses n'utilise la récursivité jusqu'à présent ...
la source
la source
Méthode
Usage
Étant donné le tableau de [1,2,3]
la source