107 votes

Façon plus claire à virgule-délimiter une liste (Java) ?

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?

235voto

toolkit Points 27248

Voir aussi #285523

82voto

Trunk Javastic Points 2838
org.apache.commons.lang.StringUtils.join(list,",");

19voto

Stefan Kendall Points 28274
<pre><code></code><p><a href="http://guava-libraries.googlecode.com/svn/tags/release09/javadoc/com/google/common/base/Joiner.html">Joiner</a>.</p></pre>

7voto

Henryk Konsek Points 3076

Si vous utilisez le Framework Spring vous pouvez le faire avec StringUtils:

6voto

13ren Points 3672

Basé sur l’implémentation de toString liste de Java :

Il utilise une grammaire comme ceci :

En étant axée sur le dernier à la place d’axée sur la première, il peut vérifier pour sauter-virgule avec le même test pour vérifier la fin-de-list. Je pense que celui-ci est très élégant, mais je ne suis pas sûr de la clarté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X