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é?