Quelle est la façon la plus claire par des virgules délimiter une liste en Java?
Je sais que plusieurs façons de le faire, mais je me demandais quelle est la meilleure façon est (où le "meilleur" signifie la plus claire et/ou le plus court, pas le plus efficace.
J'ai une liste et je veux faire une boucle sur elle, l'impression de chaque valeur. Je veux imprimer une virgule entre chaque élément, mais pas après le dernier (ni avant que 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
}
}
La solution de l'échantillon 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());
}
Ces traiter le premier point spécialement; et l'on pourrait au contraire les traiter de la dernière spéciale.
D'ailleurs, voici comment Liste toString est mis en œuvre (c'est héritée de AbstractCollection), dans la version 1.6 de Java:
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 sort de 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 "(cette Collection)"; voici le code de la provoquer:
List l = new LinkedList();
l.add(l);
System.out.println(l);
Je suis preneur de toute solution, même si elles utilisent inattendu bibliothèques (regexp?); et aussi des solutions dans des langues autres que Java (par exemple, je pense que Python/Ruby ont un parsemer de fonction - comment est que la mise en œuvre?).
Précisions: les bibliothèques, je veux dire les bibliothèques de base de Java. Pour d'autres bibliothèques, je les considère avec d'autres langues, et curieux de savoir comment ils sont mis en œuvre.
EDIT toolkit mentionné une question similaire: la Dernière itération de la boucle for en java
Et un autre: Le dernier élément dans une boucle méritent un traitement à part?