convertir - Java: unir matriz de primitivas con separador
join string array java 7 (6)
Supongamos, tengo una matriz:
int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
Y necesito unir sus elementos usando el separador, por ejemplo, " - "
, así que como resultado debería obtener una cadena como esta:
"1 - 2 - 3 - 4 - 5 - 6 - 7"
¿Cómo podría hacer esto?
PD: sí, conozco this y this , pero sus soluciones no funcionarán con una variedad de primitivos.
Aquí lo que se me ocurrió. Hay varias formas de hacerlo y dependen de las herramientas que utilice.
Usando StringUtils
y ArrayUtils
de Common Lang :
int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
String result = StringUtils.join(ArrayUtils.toObject(arr), " - ");
No puedes simplemente usar StringUtils.join(arr, " - ");
porque StringUtils
no tiene esa versión sobrecargada de método. Sin embargo, tiene el método StringUtils.join(int[], char)
.
Funciona en cualquier versión de Java, desde 1.2.
Usando flujos de Java 8:
Algo como esto:
int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
String result = Arrays.stream(arr)
.mapToObj(String::valueOf)
.collect(Collectors.joining(" - "));
De hecho, hay muchas variaciones para lograr el resultado utilizando flujos.
El método String.join()
Java 8 solo funciona con cadenas, por lo que para usarlo todavía tiene que convertir int[]
en String[]
.
String[] sarr = Arrays.stream(arr).mapToObj(String::valueOf).toArray(String[]::new);
String result = String.join(" - ", sarr);
Si no usaba Java 7 o una versión anterior sin bibliotecas, podría escribir su propio método de utilidad:
public static String myJoin(int[] arr, String separator) {
if (null == arr || 0 == arr.length) return "";
StringBuilder sb = new StringBuilder(256);
sb.append(arr[0]);
//if (arr.length == 1) return sb.toString();
for (int i = 1; i < arr.length; i++) sb.append(separator).append(arr[i]);
return sb.toString();
}
De lo que puedes hacer:
int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
String result = myJoin(arr, " - ");
En Java 8+ puedes usar un IntStream
y un StringJoiner
. Algo como,
int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7 };
StringJoiner sj = new StringJoiner(" - ");
IntStream.of(arr).forEach(x -> sj.add(String.valueOf(x)));
System.out.println(sj.toString());
La salida es (según lo solicitado)
1 - 2 - 3 - 4 - 5 - 6 - 7
Estoy seguro de que también hay una forma de hacer esto en Kotlin / Scala u otros idiomas de JVM, pero siempre podría mantener las cosas simples para un pequeño conjunto de valores como el que tiene arriba:
int i, arrLen = arr.length;
StringBuilder tmp = new StringBuilder();
for (i=0; i<arrLen-1; i++)
tmp.append(arr[i] +" - ");
tmp.append(arr[arrLen-1]);
System.out.println( tmp.toString() );
He estado buscando una manera de unir primitivas en un Stream sin crear una primera instancia de cadenas para cada uno de ellos. He llegado a esto, pero todavía requiere boxearlos.
LongStream.range(0, 500).boxed().collect(Collector.of(StringBuilder::new, (sb, v) -> {
if (sb.length() != 0)
sb.append('','');
sb.append(v.longValue());
}, (a, b) -> a.length() == 0 ? b : b.length() != 0 ? a.append('','').append(b) : a, StringBuilder::toString));
Puedes usar la guayaba para unir elementos. Más ejemplos y documentos que puedes encontrar allí. https://github.com/google/guava/wiki/StringsExplained
Joiner.on("-")
.join(texts);
Para ser más precisos, primero debe incluir su matriz en una List
con Arrays.asList()
o equivalentes primitive-friendly de Guava.
Joiner.on("-")
.join(Arrays.asList(1, 2, 3, 4, 5, 6, 7));
Joiner.on("-")
.join(Ints.asList(arr));
int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7 };
IntStream.of(arr).mapToObj(i -> String.valueOf(i)).collect(Collectors.joining(",")) ;