วิธีการแปลงอาร์เรย์ถ่านกลับไปเป็นสตริง?


405

ฉันมีอาร์เรย์ถ่าน:

char[] a = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};

ทางออกปัจจุบันของฉันคือการทำ

String b = new String(a);

แต่แน่นอนว่ามีวิธีที่ดีกว่าในการทำเช่นนี้?


151
ทำไมคิดว่ามีวิธีที่ดีกว่า และอย่าเรียกฉันว่าเชอร์ลี่ย์ :)
Hovercraft ที่เต็มไปด้วยปลาไหล

เพราะฉันมักจะเชื่อมโยงการสร้างตัวแปรใหม่เช่นด้านบนเพื่อให้หัวเล็กน้อยระหว่างรันไทม์ เช่นถ้าฉันใส่บรรทัดด้านบนเพื่อแปลงอาร์เรย์ถ่านเป็นสตริงเป็นห่วงสำหรับตัวอย่างสำหรับฉันมันไม่ได้ดูค่อนข้างขวา และใช่ฉันเป็นคนชอบความสมบูรณ์แบบ . .
chutsu

1
หากคุณมีพวกเหล่านี้มากมายให้พูดอาร์เรย์หรือชุดอักขระ char [] จากนั้นบางทีคุณอาจต่อท้ายอาร์เรย์ถ่านไปยัง StringBuffer แต่สำหรับสตริงที่นี่หรือตรงนั้นสิ่งที่คุณโพสต์คือสิ่งที่คุณใช้มากที่สุด
เรือ Hovercraft ที่เต็มไปด้วยปลาไหล

หากคุณกำลังมองหาวิธีหลีกเลี่ยงการคัดลอกอักขระ [] แสดงว่าไม่มี มิฉะนั้นคุณสามารถทำลายความไม่สามารถเปลี่ยนได้ของ String
Paul Cager

13
"การสร้างตัวแปรใหม่" มีค่าใช้จ่ายเป็นศูนย์ ตัวแปรคือชื่อที่ใช้เพื่ออ้างถึงค่าและชื่อตัวเองไม่ปรากฏที่ใดก็ได้ในหน่วยความจำที่รันไทม์ (อย่างน้อยไม่ใช่ในภาษาอย่าง Java ที่มีการสะท้อนค่อนข้าง จำกัด ) "ค่าใช้จ่าย" มาจากการสร้างค่าใหม่และไม่มีทางแก้ไขในกรณีของคุณเนื่องจากปัญหาของคุณคือ "สร้างค่านี้" คุณไม่สามารถทำให้อาร์เรย์ถ่านแปลงสัญญาณเป็นสตริงได้อย่างน่าอัศจรรย์ คุณสามารถจัดเรียงแถวลำดับถ่านดั้งเดิมเพื่อรวบรวมขยะหลังจากสร้างสตริงแล้ว
Karl Knechtel

คำตอบ:


212

ไม่ทางออกนั้นถูกต้องและน้อยมาก

แต่ทราบว่านี่เป็นสถานการณ์ที่ผิดปกติอย่างมากเพราะStringมีการจัดการเป็นพิเศษใน Java แม้เป็นจริง"foo" Stringดังนั้นความต้องการในการแยกสตริงออกเป็นส่วนบุคคลcharและเข้าร่วมกลับไม่จำเป็นต้องใช้ในรหัสปกติ

เปรียบเทียบสิ่งนี้กับ C / C ++ ที่"foo"คุณมีกลุ่มของchars ถูกยกเลิกโดยศูนย์ไบต์ในด้านหนึ่งและstringอีกด้านหนึ่งและการแปลงจำนวนมากระหว่างพวกเขาเนื่องจากวิธีการดั้งเดิม


146

String text = String.copyValueOf(data);

หรือ

String text = String.valueOf(data);

เป็นเนื้อหาที่ดีกว่า (สรุปการnew Stringโทร)


6
ทั้งสองวิธีเรียกString(char[])หรือแตกต่างจากนั้น String(char[])และเป็นส่วนหนึ่งคัดลอกที่อยู่ภายในทำ ทำให้ไม่ได้รับประโยชน์จากการโทรโดยตรงนอกเหนือจากสมมาตรกับvalueOfวิธีการอื่น
AH

1
OOP คงที่และมากกว่านั้นเป็นข้อขัดแย้งของข้อกำหนด สิ่งใดที่ประกาศคงไม่ได้เป็นส่วนหนึ่งของวัตถุหรือพฤติกรรมของมันและดังนั้นจึงไม่ได้มุ่งเน้นวัตถุ นอกจากนี้ - ถ้าจะมีโอกาสใด ๆ ว่าการดำเนินการStringจะมีการเปลี่ยนแปลงและ / หรือปรับปรุงในทางที่ไม่เข้ากันหรือการใช้งานการแข่งขันหลายสามารถเลือกที่รันไทม์แล้วคงโรงงานวิธีทำให้รู้สึก Stringนี้จะไม่เกิดขึ้นด้วยเช่นสิ่งที่ระดับต่ำเป็น ดังนั้นหลักฐานของฉันคือ: ใช้ค้อนที่เล็กที่สุดที่เหมาะสมไม่ใช่ค้อนที่มีขนาดใหญ่ที่สุด
AH

@ Ah ฉันไม่รู้เกี่ยวกับเรื่องนั้น String ให้วิธีการ StringBuffer ซึ่งให้วิธีการ StringBuilder ฉันเดิมพันผู้สนับสนุน StringBuffer พูดในสิ่งเดียวกันแล้วและตอนนี้ต้อง refactor รหัสเพื่อใช้ StringBuilder
corsiKa

1
@AH ความจริงที่ว่าพวกเขาต้องสร้างCharSequenceอินเทอร์เฟซแสดงให้เห็นว่าข้อบกพร่องของคุณ "จะไม่เกิดขึ้นกับสิ่งที่ระดับต่ำเช่นสตริง" คือ - พวกเขาจะไม่เปลี่ยนสิ่งที่เกิดขึ้นในสตริงเพราะพวกเขาผูกตัวเองไปก่อน พวกเขาจะไม่มี
corsiKa

1
@corsiKa ฉันไม่ได้บอกว่า String API นั้นดีและดีทั้งหมด เพียง แต่มันจะไม่เปลี่ยนแปลงในวิธีที่เข้ากันไม่ได้และชั้นเรียนและตัวสร้างของมันจะไม่ไปไหน :-)
AH

37

สิ่งนี้จะแปลงถ่านอาร์เรย์กลับเป็นสตริง:

char[] charArray = {'a', 'b', 'c'};
String str = String.valueOf(charArray);

14
String str = "wwwwww3333dfevvv";
char[] c = str.toCharArray();

ทีนี้การแปลงอาเรย์ตัวละครเป็น String มีสองวิธี

Arrays.toString(c);

[w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v]ส่งกลับสตริง

และ:

String.valueOf(c)

wwwwww3333dfevvvส่งกลับสตริง

ในการสรุป : ใส่ใจกับArrays.toString(c)เพราะคุณจะได้รับแทน"[w, w, w, w, w, w, 3, 3, 3, 3, d, f, e, v, v, v]""wwwwww3333dfevvv"


7

String ใน java เป็นเพียงวัตถุรอบ ๆ อาร์เรย์ของตัวอักษร ดังนั้น

char[]

เหมือนกับสตริงที่ไม่มีกล่องซึ่งมีอักขระเหมือนกัน โดยการสร้างสตริงใหม่จากชุดอักขระของคุณ

new String(char[])

คุณกำลังบอกคอมไพเลอร์ให้ autobox วัตถุ String รอบ ๆ ตัวละครของคุณ


3

คุณสามารถใช้String.valueOfวิธีการ

ตัวอย่างเช่น,

char[] a = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};
String b = String.valueOf(a);
System.out.println("Char Array back to String is: " + b);

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ char char to string คุณสามารถอ้างอิงลิงค์ด้านล่าง

https://docs.oracle.com/javase/7/docs/api/java/lang/String.html

https://www.flowerbrackets.com/convert-char-array-to-string-java/


2
package naresh.java;

public class TestDoubleString {

    public static void main(String args[]){
        String str="abbcccddef";    
        char charArray[]=str.toCharArray();
        int len=charArray.length;

        for(int i=0;i<len;i++){
            //if i th one and i+1 th character are same then update the charArray
            try{
                if(charArray[i]==charArray[i+1]){
                    charArray[i]='0';                   
                }}
                catch(Exception e){
                    System.out.println("Exception");
                }
        }//finally printing final character string
        for(int k=0;k<charArray.length;k++){
            if(charArray[k]!='0'){
                System.out.println(charArray[k]);
            }       }
    }
}

ในขณะที่รหัสนี้อาจตอบคำถาม แต่มีบริบทเพิ่มเติมเกี่ยวกับสาเหตุและ / หรือวิธีการที่รหัสนี้ตอบคำถามช่วยปรับปรุงมูลค่าระยะยาว
baikho

1
 //Given Character Array 
  char[] a = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};


    //Converting Character Array to String using String funtion     
    System.out.println(String.valueOf(a));
    //OUTPUT : hello world

การแปลง Array type ให้เป็น String โดยใช้ฟังก์ชั่น Java 8 Stream

String stringValue = 
Arrays.stream(new char[][]{a}).map(String::valueOf).collect(Collectors.joining());

1

ลองใช้java.util.Arraysดู โมดูลนี้มีวิธีการที่มีประโยชน์มากมายซึ่งสามารถนำมาใช้ที่เกี่ยวข้องกับอาร์เรย์

Arrays.toString(your_array_here[]);


0

เพียงแค่ใช้ String.value เช่นด้านล่าง;

  private static void h() {

        String helloWorld = "helloWorld";
        System.out.println(helloWorld);

        char [] charArr = helloWorld.toCharArray();

        System.out.println(String.valueOf(charArr));
    }


-4

คุณยังสามารถใช้คลาส StringBuilder

String b = new StringBuilder(a).toString();

การใช้ String หรือ StringBuilder จะแตกต่างกันไปตามข้อกำหนดวิธีการของคุณ


ทำไมถึงเป็นเช่นนั้น คุณได้อะไรจากการทำเช่นนี้?
Casey

-12

1 วิธีอื่นคือ:

String b = a + "";

3
นี้ไม่ถูกต้องในขณะที่มันอนุมานว่าการทำงานอย่างถูกต้องบนtoString char[]มันอาจทำงานกับผู้จำหน่ายเฉพาะและรุ่นของ JVM
fommil

3
เนื่องจากคลาส String ไม่เปลี่ยนรูปสิ่งนี้จะทำให้การดำเนินการสองอย่าง: toString () เรียกใช้aและสร้างวัตถุ String อื่นที่เชื่อมโยงกับa.toString()และ""
Alpay
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.