2016-07-17 13 views
15

Angenommen verbinden, habe ich ein Array:Java: Array von Primitiven mit Separator

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

Und ich brauche ihre Elemente zu verbinden Trennzeichen, beispielsweise " - ", so wie das Ergebnis, das ich Zeichenfolge wie diese erhalten sollte :

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

Wie könnte ich das tun?

PS: ja, ich weiß über this und this Beiträge, aber seine Lösungen werden nicht mit einer Reihe von Grundelementen arbeiten.

Antwort

31

Hier, was ich mir ausgedacht habe. Es gibt mehrere Möglichkeiten, dies zu tun und sie sind abhängig von den Tools, die Sie verwenden.


Mit StringUtils und ArrayUtils von Common Lang:

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

Sie können nicht nur StringUtils.join(arr, " - "); weil StringUtils verwendet nicht, dass überladene Version der Methode haben. Obwohl es Methode StringUtils.join(int[], char) hat.

Funktioniert in jeder Java-Version, von 1.2.


mit Java 8 Streams:

Etwas wie folgt aus:

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

In der Tat gibt es viele Variationen des Ergebnisses mit Hilfe von Streams achive.

Java 8 Methode String.join() nur mit Strings arbeitet, so dass es zu benutzen Sie noch int[] zu String[] konvertieren.

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

Wenn Sie mit Java 7 oder früher ohne Bibliotheken stecken, könnten Sie Ihre eigene Hilfsmethode schreiben:

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

als Sie tun können:

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

Sie können '.collect (Collectors.joining (", "))' anstelle des Temp-String-Arrays. – shmosel

+2

Schöner Überblick! Für die Java 1.7-Version: Technisch gesehen benötigen Sie den arr.length == 1-Check vor der Schleife nicht, aber das funktioniert auch perfekt. – n247s

+0

@smossel, nein. 'Arrays.stream (arr)' erzeugt einen 'IntStream' und darin gibt es keine solche' collect() 'Methode. – spirit

3

Sie kann Guava zum Verbinden von Elementen verwenden. Weitere Beispiele und Dokumente finden Sie dort. https://github.com/google/guava/wiki/StringsExplained

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

Um genauer zu sein, das Sie zunächst Ihr Array in eine List mit Arrays.asList() oder Guava der wickeln sollte primitive-friendly Äquivalente.

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

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

Für primitive Arrays stellt Gava primitive '.asList()' Methoden, z.B. ['Ints.asList()'] (https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/primitives/Ints.html#asList (int ...)) - Sie können 'Array.asList()' nicht mit primitiven Arrays verwenden. – dimo414

+0

ok, meine schlechte wird mich korrigieren – RMachnik

+0

yep, 'Arrays.asList (arr)' wird eine 'List' mit der Größe von 1 =) Und das ist ein Element wird unser primitives Array sein. – spirit

7

In Java 8+ könnten Sie ein IntStream und ein StringJoiner verwenden.So etwas wie,

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

Ausgang ist (wie gewünscht)

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

guten einen! Wie gesagt, es gibt viele Möglichkeiten, dies über Streams zu tun. – spirit

2

Ich bin sicher, dass ein Weg, gibt es diese auch in Kotlin/Scala oder anderen JVM Sprachen zu tun, aber man konnte immer an halten Dinge einfach für eine kleine Gruppe von Werten wie Sie oben:

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.von (arr) .mapToObj (i -> String.valueOf (i)). Sammeln (Collectors.joining (","));

Verwandte Themen