แปลงอาร์เรย์ของสตริงเป็นสตริงใน Java


242

ฉันต้องการรหัส Java สำหรับการแปลงอาร์เรย์ของสตริงเป็นสตริง


อาร์เรย์แบบไหน? อาเรย์ของสตริง?
adarshr

2
array.toString()? เฉพาะเจาะจงมากขึ้น.
Stan Kurilin

1
@Princeyesuraj ที่อย่างเป็นทางการคำตอบที่ให้บริการโดยadarshr หากคุณต้องการตัวคั่นคุณสามารถลองคำตอบของJoeSlavและหากไม่มีปัญหาเธรดคุณสามารถใช้StringBuilderแทนStringBufferเพื่อประสิทธิภาพ คำตอบของkrockนั้นดี แต่ฉันคิดว่ามากไปหน่อย
Dante May Code

คำตอบ:


470

หากคุณต้องการดัมพ์แบบ "debug-style" ของอาร์เรย์:

String str = Arrays.toString(arr);

หรือเพื่อการควบคุมเพิ่มเติม (ก่อนหน้า Java 8):

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

(Java 8 ขึ้นไป):

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

และถ้าคุณมาจากมุม Android:

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

คุณสามารถแก้ไขข้างต้นขึ้นอยู่กับอักขระที่คุณต้องการในระหว่างสตริง

คุณอาจเห็นโค้ดใกล้เคียงกับโค้ด pre-Java 8 แต่ใช้StringBuffer- StringBuilderเป็นคลาสที่ใหม่กว่าที่ไม่ปลอดภัยสำหรับเธรด แต่มีประสิทธิภาพที่ดีกว่าในเธรดเดี่ยว ในระยะสั้นคุณใช้ดีกว่าStringBuilderใน 99% ของกรณี - ฟังก์ชั่นที่ชาญฉลาดทั้งสองเหมือนกัน

ไม่ต้องใช้สตริงและเพียงต่อท้ายด้วย + = เหมือนคำตอบที่แสดงไว้ที่นี่ สิ่งนี้จะส่ง GC ผ่านหลังคาเพราะคุณกำลังสร้างและทิ้งวัตถุสตริงให้มากที่สุดเท่าที่คุณมีรายการในอาร์เรย์ สำหรับอาร์เรย์ขนาดเล็กคุณไม่อาจสังเกตเห็นความแตกต่างได้ แต่สำหรับขนาดใหญ่มันอาจเป็นลำดับที่ช้ากว่า


13
ขอบคุณสำหรับคำอธิบายว่าเพราะเหตุใด StringBuilder จึงยอดเยี่ยมถึง + = สำหรับการต่อท้าย
Nicholas Miller

5
หากคุณใช้ + = ภายใต้หน้าปกของ Java จะทำการแปลงเป็นแบบ StringBuilder
Javamann

6
@matteo คุณต้องใช้Arrays.toString(yourArray);แต่ฉันเดาว่าคุณเคยใช้yourArray.toString();
Dzarafata

5
ตั้งแต่ java 1.8คุณยังสามารถใช้String::joinแทน for-loop String.join("", arr);
Jorn Vernee

2
นักพัฒนา Android สามารถใช้งานเช่น String result = TextUtils.join (",", list); stackoverflow.com/questions/33802971/…
Rahul Hawge

102

ใช้ Apache StringUtils.join()ทั่วไป มันต้องใช้อาร์เรย์เป็นพารามิเตอร์ (และยังมีเกินพิกัดIterableและIteratorพารามิเตอร์) และเรียกร้องให้toString()แต่ละองค์ประกอบ (ถ้ามันไม่เป็นโมฆะ) เพื่อให้ได้รับการเป็นตัวแทนสตริงแต่ละองค์ประกอบ การแทนค่าสตริงองค์ประกอบแต่ละรายการจะถูกรวมเข้าเป็นหนึ่งสตริงโดยมีตัวคั่นอยู่ระหว่างหากระบุไว้:

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

ผลิต:

a-b-1

1
การแก้ไขเล็กน้อย: joinString = StringUtils.join (วัตถุใหม่ [] {"a", "b", "1"}, "-");
questborn

35

ฉันชอบใช้Guava Joiner ของ Googleเช่น:

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

จะผลิตสตริงเดียวกันกับ:

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

ETA: Java 8 มีการสนับสนุนที่คล้ายกันในขณะนี้:

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

ไม่เห็นการสนับสนุนสำหรับการข้ามค่า Null แต่สามารถแก้ไขได้อย่างง่ายดาย


10
แต่ถ้าเราเป็นจริงกับพล็อตnullจะเป็น "เขาที่มีชื่อไม่ต้องพูดถึง" :-)
สตีเฟ่นซี

22
หากคุณกล้า: ;-)Joiner.on(", ").useForNull("Voldemort").join("Harry", null, "Ron", "Hermione");
rich

ใช้ java-8String.join(", ", "Harry", null, "Ron", "Hermione").replaceAll("null", "Voldermart");
Cjo

13

คุณสามารถทำสิ่งนี้ได้รับอาร์เรย์aประเภทดั้งเดิม:

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 เก่าใช้ StringBuilder แทนซึ่งไม่มีการซิงโครไนซ์ที่ไม่จำเป็นสำหรับใช้ในเธรดเดียว
Jason S

13

จาก Java 8 วิธีที่ง่ายที่สุดที่ฉันคิดคือ:

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

วิธีนี้คุณสามารถเลือกตัวคั่นโดยพลการ


10

ลองใช้วิธีการArrays.deepToString

ส่งคืนการแทนค่าสตริงของ "เนื้อหาลึก" ของอาร์เรย์ที่ระบุ ถ้าอาร์เรย์มีอาร์เรย์อื่นเป็นองค์ประกอบการแทนค่าสตริงจะมีเนื้อหาและอื่น ๆ วิธีนี้ถูกออกแบบมาสำหรับการแปลงอาร์เรย์หลายมิติเป็นสตริง


หากคุณไม่ต้องการการควบคุมมากฉันเชื่อว่านี่เป็นวิธีที่ง่ายที่สุดเนื่องจากคุณไม่ต้องการ lib บุคคลที่สาม นี่คือตัวอย่าง: System.out.println (Arrays.deepToString (args));
neves

7

ลองใช้วิธีการArrays.toStringมากเกินไป

หรือลองใช้การใช้งานทั่วไปด้านล่างนี้:

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

จากนั้นบอกรูปแบบที่คุณต้องการ ไม่เช่นนั้นเราไม่สามารถเดาได้ว่าคุณมีอะไรในใจ
Jason S

3

ต่อไปนี้เป็นตัวอย่างของการแปลง Array เป็น String

    ArrayToString คลาสสาธารณะ
    {
โมฆะคงที่สาธารณะหลัก (String [] args) { String [] 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

หากคุณไม่มีตัวเลือก แต่ใช้ Java 6 หรือ 7 คุณควรใช้การเข้าร่วม Divide & Conquer


0

คุณต้องการโค้ดที่สร้างสตริงจาก arrayList

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

คุณสามารถทำได้สองวิธี: การใช้ String เป็นผลลัพธ์หรือ StringBuffer / StringBuilder

ตัวอย่าง:

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

... แต่นี่ไม่ใช่วิธีปฏิบัติที่ดีเนื่องจากเหตุผลด้านประสิทธิภาพ ดีกว่าใช้StringBuffer (เธรดที่ปลอดภัย) หรือStringBuilderซึ่งเหมาะสมกับการเพิ่ม Strings



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

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

System.out.print(s);

1
คำตอบของคุณนั้นเหมือนกับ smas เพียงซับซ้อนกว่านี้เล็กน้อย จึงไม่แน่ใจว่า "ง่ายที่สุด" และนอกจากนี้ Arrays.toString () ยังง่ายยิ่งขึ้น
GhostCat

-22

หากคุณรู้ว่ามีองค์ประกอบเท่าใดอาร์เรย์วิธีง่ายๆในการทำเช่นนี้:

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

10
ซึ่งแทบจะไม่มีผลกับโลกแห่งความจริง
Jk1

3
อาจเป็นเหรียญทองที่ยอดเยี่ยมสำหรับการบรรลุผลเป็นลบ -50
Pablo Cegarra
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.