2016-07-17 116 views
15

Supponiamo, ho un array:Java: unire array di primitive con separatore

int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7}; 

E ho bisogno di unire i suoi elementi utilizzando separatore, ad esempio, " - ", così come il risultato dovrei ottenere stringa come questa :

"1 - 2 - 3 - 4 - 5 - 6 - 7" 

Come posso fare questo?

PS: Sì, lo so circa this e this messaggi, ma le sue soluzioni non funzionano con una serie di primitive.

risposta

31

Ecco cosa mi è venuto in mente. Ci sono diversi modi per farlo e dipendono dagli strumenti che usi.


Utilizzando StringUtils e ArrayUtils da Common Lang:

int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7}; 
String result = StringUtils.join(ArrayUtils.toObject(arr), " - "); 

Non si può semplicemente utilizzare StringUtils.join(arr, " - "); perché StringUtils non ha quel versione di overload del metodo. Tuttavia, ha il metodo StringUtils.join(int[], char).

Funziona con qualsiasi versione Java, da 1.2.


Utilizzo di Java 8 flussi:

qualcosa di simile:

int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7}; 
String result = Arrays.stream(arr) 
     .mapToObj(String::valueOf) 
     .collect(Collectors.joining(" - ")); 

In realtà, ci sono molte variazioni più adeguati per svolgere il risultato usando flussi.

Il metodo Java 8 String.join() funziona solo con stringhe, quindi per utilizzarlo è necessario convertire lo int[] in String[].

String[] sarr = Arrays.stream(arr).mapToObj(String::valueOf).toArray(String[]::new); 
String result = String.join(" - ", sarr); 

Se bloccato utilizzando Java 7 o versioni precedenti con biblioteche, si potrebbe scrivere il proprio metodo di utilità:

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(); 
} 

di quanto si può fare:

int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7}; 
String result = myJoin(arr, " - "); 
+1

È possibile '.collect (Collectors.joining (", "))' invece della matrice di stringhe temporanee. – shmosel

+2

Bella panoramica! Per la versione java 1.7: tecnicamente non avrai bisogno del controllo arr.length == 1 prima del ciclo, ma funziona perfettamente. – n247s

+0

@shmosel, no. 'Arrays.stream (arr)' produce un 'IntStream' e in esso non esiste alcun metodo' collect() '. – spirit

3

È puoi usare Guava per unire elementi. Altri esempi e documenti che puoi trovare lì. https://github.com/google/guava/wiki/StringsExplained

Joiner.on("-") 
     .join(texts); 

Per essere più precisi si dovrebbe in primo luogo avvolgere il vostro array in un List con Arrays.asList() o primitive-friendly equivalenti di Guava.

Joiner.on("-") 
     .join(Arrays.asList(1, 2, 3, 4, 5, 6, 7)); 

Joiner.on("-") 
     .join(Ints.asList(arr)); 
+2

Per gli array primitivi Gava fornisce i metodi '.asList()' primitivi, ad es. [ 'Ints.asList()'] (https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/primitives/Ints.html#asList (int ...)) - non puoi usare 'Array.asList()' con gli array primitivi. – dimo414

+0

ok, il mio male correggerà me stesso – RMachnik

+0

sì, 'Arrays.asList (arr)' produrrà un 'Elenco' con dimensione di 1 =) E questo è un elemento che sarà il nostro array primitivo. – spirit

7

In Java 8+ si potrebbe usare un IntStream e StringJoiner.Qualcosa di simile,

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()); 

uscita è (come richiesto)

1 - 2 - 3 - 4 - 5 - 6 - 7 
+0

buono! come ho detto, ci sono molti modi per farlo attraverso i flussi. – spirit

2

Sono sicuro che c'è un modo per fare questo in Kotlin/Scala o di altre lingue JVM come pure, ma si può sempre attaccare a mantenere cose semplici per un piccolo insieme di valori come te hanno sopra:

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()); 
0

int [] arr = new int [] {1, 2, 3, 4, 5, 6, 7};

IntStream.of (arr) .mapToObj (i -> String.valueOf (i)). Collect (Collectors.joining (","));