Chuyển đổi mảng chuỗi thành chuỗi trong Java


241

Tôi muốn mã Java để chuyển đổi một chuỗi các chuỗi thành một chuỗi.


Những loại mảng? Mảng dây?
adarshr

2
array.toString()? Hãy cụ thể hơn.
Stan Kurilin

1
@Princeyesuraj, câu trả lời chính thức được cung cấp bởi adarshr . Nếu bạn muốn phân tách riêng, bạn có thể thử câu trả lời của JoeSlav và nếu không có vấn đề về luồng, bạn có thể sử dụng StringBuilder thay vì StringBuffer để thực hiện. Câu trả lời của krock là tốt, nhưng theo tôi thì hơi quá mức.
Mã Dante tháng 5 ngày

Câu trả lời:


469

Nếu bạn chỉ muốn một bãi chứa "kiểu gỡ lỗi" của một mảng:

String str = Arrays.toString(arr);

hoặc, để kiểm soát nhiều hơn (trước Java 8):

StringBuilder builder = new StringBuilder();
for(String s : arr) {
    builder.append(s);
}
String str = builder.toString();

(Java 8 trở lên):

String str = String.join(",", arr);

Và nếu bạn đến từ góc độ Android:

String str = TextUtils.join(",", arr);

Bạn có thể sửa đổi ở trên tùy thuộc vào ký tự nào, nếu có, bạn muốn ở giữa các chuỗi.

Bạn có thể thấy mã gần giống với mã tiền Java 8 nhưng sử dụng StringBuffer- StringBuilderlà một lớp mới hơn không an toàn cho luồng, nhưng do đó có hiệu suất tốt hơn trong một luồng vì nó không đồng bộ hóa không cần thiết. Nói tóm lại, bạn tốt hơn khi sử dụng StringBuilder99% trường hợp - chức năng khôn ngoan, cả hai đều giống hệt nhau.

KHÔNG sử dụng một chuỗi và chỉ nối nó với + = giống như một số câu trả lời hiển thị ở đây. Điều này sẽ gửi GC qua mái nhà vì bạn đang tạo và ném đi nhiều đối tượng chuỗi như bạn có các mục trong mảng của mình. Đối với các mảng nhỏ, bạn có thể không thực sự nhận thấy sự khác biệt, nhưng đối với các mảng lớn, nó có thể là các đơn đặt hàng có cường độ chậm hơn.


13
Cảm ơn lời giải thích về lý do StringBuilder vượt trội hơn + = khi nối thêm.
Nicholas Miller

5
Nếu bạn sử dụng dấu + = trong các trang bìa, Java sẽ chuyển đổi nó thành sử dụng StringBuilder.
Javamann

6
@matteo, Bạn phải sử dụng Arrays.toString(yourArray);nhưng tôi đoán Bạn đã sử dụngyourArray.toString();
Dzarafata

5
Vì java 1.8bạn cũng có thể sử dụng String::join, thay vì vòng lặp for. String.join("", arr);
Jorn Vernee

2
Các nhà phát triển Android có thể sử dụng như String result = TextUtils.join (",", list); stackoverflow.com/questions/33802971/
hy

102

Sử dụng chung Apache StringUtils.join(). Nó nhận một mảng, như một tham số (và cũng có quá tải cho IterableIteratortham số) và gọi toString()từng phần tử (nếu nó không phải là null) để có được mỗi đại diện chuỗi phần tử. Mỗi đại diện chuỗi phần tử sau đó được nối thành một chuỗi với dấu phân cách ở giữa nếu một chuỗi được chỉ định:

String joinedString = StringUtils.join(new Object[]{"a", "b", 1}, "-");
System.out.println(joinedString);

Sản xuất:

a-b-1

1
sửa chữa nhỏ: tham giaString = StringUtils.join (đối tượng mới [] {"a", "b", "1"}, "-");
Questborn

35

Tôi thích sử dụng Google Guava Joiner cho việc này, ví dụ:

Joiner.on(", ").skipNulls().join("Harry", null, "Ron", "Hermione");

sẽ tạo ra Chuỗi giống như:

new String("Harry, Ron, Hermione");

ETA: Java 8 hiện có hỗ trợ tương tự:

String.join(", ", "Harry", "Ron", "Hermione");

Không thể thấy hỗ trợ bỏ qua các giá trị null, nhưng điều đó dễ dàng làm việc xung quanh.


10
Nhưng nếu chúng ta đúng với cốt truyện, nullsẽ là "anh ta không được nhắc đến tên" :-)
Stephen C

22
Nếu bạn dũng cảm: ;-)Joiner.on(", ").useForNull("Voldemort").join("Harry", null, "Ron", "Hermione");
giàu

Sử dụng java-8String.join(", ", "Harry", null, "Ron", "Hermione").replaceAll("null", "Voldermart");
Cjo

13

Bạn có thể làm điều này, đưa ra một loạt acác kiểu nguyên thủy:

StringBuffer result = new StringBuffer();
for (int i = 0; i < a.length; i++) {
   result.append( a[i] );
   //result.append( optional separator );
}
String mynewstring = result.toString();

23
StringBuffer đã cũ, sử dụng StringBuilder thay vào đó không có đồng bộ hóa không cần thiết để sử dụng trong một luồng.
Jason S

13

Từ Java 8, cách đơn giản nhất tôi nghĩ là:

    String[] array = { "cat", "mouse" };
    String delimiter = "";
    String result = String.join(delimiter, array);

Bằng cách này bạn có thể chọn một dấu phân cách tùy ý.


10

Hãy thử phương pháp Arrays.deepToString .

Trả về một chuỗi đại diện cho "nội dung sâu" của mảng được chỉ định. Nếu mảng chứa các mảng khác dưới dạng các phần tử, biểu diễn chuỗi chứa nội dung của chúng, v.v. Phương pháp này được thiết kế để chuyển đổi các mảng nhiều chiều thành chuỗi


Nếu bạn không cần nhiều sự kiểm soát, tôi tin rằng đây là giải pháp đơn giản nhất vì bạn không cần lib của bên thứ ba. Dưới đây là một ví dụ: System.out.println (Arrays.deepToString (args));
Neves

7

Hãy thử các phương thức quá tải Arrays.toString .

Hoặc nếu không, hãy thử thực hiện chung dưới đây:

public static void main(String... args) throws Exception {

    String[] array = {"ABC", "XYZ", "PQR"};

    System.out.println(new Test().join(array, ", "));
}

public <T> String join(T[] array, String cement) {
    StringBuilder builder = new StringBuilder();

    if(array == null || array.length == 0) {
        return null;
    }

    for (T t : array) {
        builder.append(t).append(cement);
    }

    builder.delete(builder.length() - cement.length(), builder.length());

    return builder.toString();
}

Sau đó cho chúng tôi biết định dạng bạn đang tìm kiếm. Mặt khác, chúng tôi không thể đoán những gì bạn có trong tâm trí.
Jason S

3

Sau đây là một ví dụ về chuyển đổi Array sang String.

    lớp công khai ArrayToString
    {
public static void main (String [] args) { Chuỗi [] strArray = new String [] {"Java", "PHP", ".NET", "PERL", "C", "COBOL"};

        String newString = Arrays.toString(strArray);

        newString = newString.substring(1, newString.length()-1);

        System.out.println("New New String: " + newString);
    }
}


1
String[] strings = new String[25000];
for (int i = 0; i < 25000; i++) strings[i] = '1234567';

String result;
result = "";
for (String s : strings) result += s;
//linear +: 5s

result = "";
for (String s : strings) result = result.concat(s);
//linear .concat: 2.5s

result = String.join("", strings);
//Java 8 .join: 3ms

Public String join(String delimiter, String[] s)
{
    int ls = s.length;
    switch (ls)
    {
        case 0: return "";
        case 1: return s[0];
        case 2: return s[0].concat(delimiter).concat(s[1]);
        default:
            int l1 = ls / 2;
            String[] s1 = Arrays.copyOfRange(s, 0, l1); 
            String[] s2 = Arrays.copyOfRange(s, l1, ls); 
            return join(delimiter, s1).concat(delimiter).concat(join(delimiter, s2));
    }
}
result = join("", strings);
// Divide&Conquer join: 7ms

Nếu bạn không có sự lựa chọn nhưng để sử dụng Java 6 hoặc 7 thì bạn nên sử dụng phép chia & chinh phục.


0

Bạn muốn mã tạo chuỗi từ ArrayList,

Iterate through all elements in list and add it to your String result

bạn có thể làm điều này theo 2 cách: sử dụng String as result hoặc StringBuffer / StringBuilder.

Thí dụ:

String result = "";
for (String s : list) {
    result += s;
}

... nhưng đây không phải là thực hành tốt vì lý do hiệu suất. Tốt hơn là sử dụng StringBuffer (chủ đề an toàn) hoặc StringBuilder phù hợp hơn để thêm Chuỗi



-1
String array[]={"one","two"};
String s="";

for(int i=0;i<array.length;i++)
{
  s=s+array[i];
}

System.out.print(s);

1
Câu trả lời của bạn về cơ bản giống như smas; chỉ phức tạp hơn một chút; do đó chắc chắn không phải là "dễ dàng nhất". Và bên cạnh đó, Arrays.toString () thậm chí còn dễ dàng hơn.
GhostCat

-22

Nếu bạn biết mảng có bao nhiêu phần tử, một cách đơn giản là làm điều này:

String appendedString = "" + array[0] + "" + array[1] + "" + array[2] + "" + array[3]; 

10
Điều đó hầu như không thể áp dụng trong thế giới thực và cho thấy một số thực tiễn lập trình xấu.
Jk1

3
Có thể là một huy chương vàng tuyệt vời để đạt được -50 tiêu cực
Pablo Cegarra
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.