¿Cuál es la forma más clara de delimitar por comas una lista en Java?
Conozco varias formas de hacerlo, pero me pregunto cuál es la mejor (donde "mejor" significa más clara y / o más corta, no la más eficiente.
Tengo una lista y quiero recorrerla, imprimiendo cada valor. Quiero imprimir una coma entre cada elemento, pero no después del último (ni antes del primero).
List --> Item ( , Item ) *
List --> ( Item , ) * Item
Solución de muestra 1:
boolean isFirst = true;
for (Item i : list) {
if (isFirst) {
System.out.print(i); // no comma
isFirst = false;
} else {
System.out.print(", "+i); // comma
}
}
Solución de muestra 2: cree una sublista:
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
}
}
Solución de muestra 3:
Iterator<Item> i = list.iterator();
if (i.hasNext()) {
System.out.print(i.next());
while (i.hasNext())
System.out.print(", "+i.next());
}
Estos tratan el primer artículo de manera especial; en su lugar, se podría tratar al último de manera especial.
Por cierto, así es como List
toString
se implementa (se hereda de AbstractCollection
), en 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(", ");
}
}
Sale del bucle antes de tiempo para evitar la coma después del último elemento. Por cierto: esta es la primera vez que recuerdo haber visto "(esta colección)"; aquí hay un código para provocarlo:
List l = new LinkedList();
l.add(l);
System.out.println(l);
Doy la bienvenida a cualquier solución, incluso si usan bibliotecas inesperadas (¿regexp?); y también soluciones en idiomas distintos de Java (por ejemplo Creo Python / Ruby tiene un intersperse función - ¿Cómo se que ? implementada).
Aclaración : por bibliotecas, me refiero a las bibliotecas estándar de Java. Para otras bibliotecas, las considero con otros lenguajes y me interesa saber cómo se implementan.
El kit de herramientas EDIT mencionó una pregunta similar: última iteración del bucle for mejorado en java
Y otro: ¿El último elemento de un bucle merece un tratamiento aparte?