2016-07-17 20 views
15

Przypuśćmy, że mam tablicę:Java: przyłączyć tablicy prymitywów z separatorem

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

I muszę dołączyć do jego elementów przy użyciu separatora, na przykład, " - ", więc w efekcie powinno uzyskać ciąg tak :

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

Jak mogę to zrobić?

PS: tak, wiem o this i this posty, ale jej rozwiązania nie będą działać z tablicą prymitywów.

Odpowiedz

31

Oto, co wymyśliłem. Jest na to kilka sposobów i zależy to od narzędzi, z których korzystasz.


Korzystanie StringUtils i ArrayUtils z Common Lang:

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

Nie można po prostu użyć StringUtils.join(arr, " - "); ponieważ StringUtils nie ma tej wersji przeciążonej metody. Chociaż ma on metodę StringUtils.join(int[], char).

Działa w dowolnej wersji Java, od wersji 1.2.


Korzystanie Java 8 strumienie:

coś takiego:

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

W rzeczywistości, istnieje wiele odmian do achive wynik za pomocą strumieni.

Metoda Java 8's String.join() działa tylko z ciągami, więc aby z niej skorzystać, musisz jeszcze przekonwertować int[] na String[].

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

Jeśli zatrzymany przy użyciu języka Java 7 lub wcześniej bez bibliotek, można napisać swoją własną metodę użytkowy:

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

niż można zrobić:

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

Możesz użyć '.collect (Collectors.joining (", "))' zamiast tablicy łańcuchów temp. – shmosel

+2

Niezły przegląd! Dla wersji 1.7 java: Z technicznego punktu widzenia nie będziesz potrzebował sprawdzać wartości arr.length == 1 przed pętlą, ale działa to również doskonale. – n247s

+0

@ shmosel, nie. 'Arrays.stream (arr)' tworzy 'IntStream', a nie ma takiej metody' collect() '. – spirit

3

ty może użyć Guava do łączenia elementów. Więcej przykładów i dokumentów, które możesz tam znaleźć. https://github.com/google/guava/wiki/StringsExplained

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

Aby być bardziej precyzyjny należy najpierw owinąć tablicę do List z Arrays.asList() lub guawy za primitive-friendly odpowiedników.

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

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

Dla prymitywnych tablic Gava zapewnia prymitywne metody '.asList()', np. ['Ints.asList()'] (https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/primitives/Ints.html#asList (int ...)) - nie możesz użyć 'Array.asList()' z prymitywnymi tablicami. – dimo414

+0

ok, mój zły poprawi się – RMachnik

+0

tak, 'Arrays.asList (arr)' wytworzy 'List' o rozmiarze 1 =) I to jest jeden element będzie naszą prymitywną tablicą. – spirit

7

W Javie 8+ można użyć IntStream i StringJoiner.Coś podobnego,

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

Wyjście jest (na żądanie)

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

dobry! jak już powiedziałem, jest wiele sposobów na zrobienie tego za pośrednictwem strumieni. – spirit

2

Jestem pewien, że istnieje sposób, aby to zrobić w Kotlin/Scala lub inne języki JVM jak dobrze, ale zawsze można trzymać na utrzymanie rzeczy proste na mały zestaw wartości, np was powyżej:

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 nowy Int [] {1, 2, 3, 4, 5, 6, 7};

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