2016-07-17 19 views
15

Giả sử, tôi có một mảng:Java: tham gia hàng loạt các nguyên thủy với tách

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

Và tôi cần phải tham gia phần tử của nó sử dụng dấu phân cách, ví dụ, " - ", như vậy là kết quả tôi sẽ nhận được chuỗi như thế này :

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

Tôi làm cách nào để thực hiện việc này?

PS: có, tôi biết về thisthis bài đăng, nhưng giải pháp của nó sẽ không hoạt động với một mảng nguyên thủy.

Trả lời

31

Đây là những gì tôi đã đưa ra. Có một số cách để làm điều này và chúng phụ thuộc vào các công cụ bạn sử dụng.


Sử dụng StringUtilsArrayUtils từ Common Lang:

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

Bạn không thể chỉ sử dụng StringUtils.join(arr, " - ");StringUtils không có phiên bản quá tải của phương pháp. Mặc dù, nó có phương pháp StringUtils.join(int[], char).

Làm việc ở bất kỳ phiên bản Java nào, từ 1.2.


Sử dụng Java 8 suối:

Something như thế này:

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

Trong thực tế, có rất nhiều biến thể để đạt được kết quả sử dụng suối.

Phương thức Java 8 String.join() chỉ hoạt động với các chuỗi, do đó, để sử dụng nó, bạn vẫn phải chuyển đổi int[] thành String[].

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

Nếu bạn bị mắc kẹt sử dụng Java 7 hoặc sớm hơn không có thư viện, bạn có thể viết phương pháp của riêng bạn tiện ích:

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

hơn bạn có thể làm:

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

Bạn có thể '.collect (Collectors.joining (", "))' thay vì mảng chuỗi tạm thời. – shmosel

+2

Tổng quan đẹp! Đối với phiên bản java 1.7: Về mặt kỹ thuật, bạn sẽ không cần arr.length == 1 kiểm tra trước vòng lặp nhưng điều này cũng hoạt động hoàn hảo. – n247s

+0

@shmosel, nope. 'Arrays.stream (arr)' tạo ra một 'IntStream' và trong đó không có phương thức' collect() 'như vậy. – spirit

3

Bạn có thể sử dụng ổi để tham gia các yếu tố. Các ví dụ và tài liệu khác mà bạn có thể tìm thấy ở đó. https://github.com/google/guava/wiki/StringsExplained

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

Để được chính xác hơn bạn trước hết nên quấn mảng của bạn thành một List với Arrays.asList() hoặc ổi của primitive-friendly tương đương.

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

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

Đối với các mảng nguyên thủy Gava cung cấp các phương thức '.asList()' nguyên thủy, ví dụ: ['Ints.asList()'] (https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/primitives/Ints.html#asList (int ...)) - bạn không thể sử dụng 'Array.asList()' với các mảng nguyên thủy. – dimo414

+0

ok, xấu của tôi sẽ sửa bản thân mình – RMachnik

+0

yep, 'Arrays.asList (arr)' sẽ tạo ra một 'Danh sách' với kích thước 1 =) Và đó là một phần tử sẽ là mảng nguyên thủy của chúng ta. – spirit

7

Trong Java 8+ bạn có thể sử dụng IntStreamStringJoiner.Một cái gì đó như thế nào,

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

Output là (theo yêu cầu)

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

tốt nhất! như tôi đã nói, có rất nhiều cách để thực hiện điều này thông qua luồng. – spirit

2

Tôi chắc rằng có một cách để làm điều này trong Kotlin/Scala hoặc các ngôn ngữ JVM khác nữa nhưng bạn luôn có thể dính vào giữ những điều đơn giản cho một tập hợp nhỏ các giá trị như bạn có ở trên:

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

Các vấn đề liên quan