¿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?
fuente
Respuestas:
Java 8 y posterior
Usando
StringJoiner
clase:Usando
Stream
, yCollectors
:Java 7 y versiones anteriores
Véase también # 285523
fuente
fuente
Java 8 proporciona varias formas nuevas de hacer esto:
join
método deString
.joining
recopilador de transmisiones de laCollectors
clase.StringJoiner
clase.Ejemplo:
El enfoque que usa corrientes asume
import static java.util.stream.Collectors.joining;
.fuente
Carpintero .
fuente
Si usa Spring Framework, puede hacerlo con StringUtils :
fuente
Basado en la implementación List toString de Java:
Utiliza una gramática como esta:
Al estar basado en el último en lugar de en el primero, puede buscar la coma con la misma prueba para verificar el final de la lista. Creo que este es muy elegante, pero no estoy seguro de la claridad.
fuente
fuente
Hay una manera bonita de lograr esto usando Java 8:
fuente
fuente
Una opción para el bucle foreach es:
fuente
Actualización : como mencionó Dave Webb en los comentarios, es posible que esto no produzca resultados correctos si los primeros elementos de la lista son cadenas vacías.
fuente
Yo suelo hacer esto:
Aunque creo que haré esta verificación de ahora en adelante según la implementación de Java;)
fuente
Si puede usar Groovy (que se ejecuta en la JVM):
fuente
(Copie y pegue mi propia respuesta de aquí ). Muchas de las soluciones descritas aquí son un poco exageradas, en mi humilde opinión, especialmente aquellas que dependen de bibliotecas externas. Hay un lenguaje agradable, limpio y claro para lograr una lista separada por comas que siempre he usado. Se basa en el operador condicional (?):
Editar : Solución original correcta, pero no óptima según los comentarios. Intentando una segunda vez:
Ahí lo tienes, en 4 líneas de código, incluida la declaración de la matriz y el StringBuilder.
2da edición : si se trata de un iterador:
fuente
Normalmente uso algo similar a la versión 3. Funciona bien c / c ++ / bash / ...: P
fuente
No lo compilé ... pero debería funcionar (o estar cerca de funcionar).
fuente
Esto es muy breve, muy claro, pero le da a mi sensibilidad los horrores que se arrastran. También es un poco incómodo adaptarse a diferentes delimitadores, especialmente si un String (no char).
Inspirado por: última iteración de bucle for mejorado en java
fuente
fuente
Item1Item2, Item3, Item4,
Me gusta un poco este enfoque, que encontré en un blog hace algún tiempo. Desafortunadamente, no recuerdo el nombre / URL del blog.
Puede crear una clase de utilidad / ayuda con este aspecto:
Usar la clase auxiliar es tan simple como esto:
fuente
Debido a que su delimitador es "," puede utilizar cualquiera de los siguientes:
Si su delimitador es CUALQUIER COSA más, entonces esto no funcionará para usted.
fuente
Me gusta esta solucion:
Supongo que también puede hacer uso de StringBuilder.
fuente
En mi opinión, este es el más simple de leer y comprender:
fuente
En Python es fácil
",". únete (tu lista)
En C # hay un método estático en la clase String
String.Join (",", su lista de cadenas)
Lo siento, no estoy seguro acerca de Java, pero pensé en hablar mientras preguntaba por otros idiomas. Estoy seguro de que habría algo similar en Java.
fuente
También puede agregar incondicionalmente la cadena delimitador y, después del bucle, eliminar el delimitador adicional al final. Luego, un "si la lista está vacía, devuelva esta cadena" al principio le permitirá evitar la marca al final (ya que no puede eliminar caracteres de una lista vacía)
Entonces la pregunta realmente es:
"Dado un bucle y un si, ¿cuál crees que es la forma más clara de tenerlos juntos?"
fuente
fuente
listToString.substring(0, listToString.length()-separator.length());
Residencia en forma más clara de delimitar una lista por comas (Java)?
Usando esta idea: ¿El último elemento de un bucle merece un tratamiento por separado?
fuente
for (int i=0; i<1; i++)
aif (array.length>0)
.fuente
Ninguna de las respuestas usa recursividad hasta ahora ...
fuente
fuente
Método
Uso
Dada la matriz de [1,2,3]
fuente