วิธีการแปลง array object เป็น array string ใน Java


244

ฉันใช้รหัสต่อไปนี้เพื่อแปลงอาร์เรย์วัตถุเป็นอาร์เรย์สตริง:

Object Object_Array[]=new Object[100];
// ... get values in the Object_Array

String String_Array[]=new String[Object_Array.length];

for (int i=0;i<String_Array.length;i++) String_Array[i]=Object_Array[i].toString();

แต่ฉันสงสัยว่ามีวิธีอื่นในการทำเช่นนี้หรือไม่:

String_Array=(String[])Object_Array;

แต่สิ่งนี้จะทำให้เกิดข้อผิดพลาดรันไทม์: Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

วิธีที่ถูกต้องในการทำคืออะไร?


3
ฉันชอบคำตอบของ waxwing ที่ดีที่สุด: String [] stringArray = Arrays.copyOf (objectArray, objectArray.length, String []. class); มันกระชับและใช้งานได้ดี ฉันนับว่าต้องใช้เวลาเท่าไรสำหรับทั้งคำตอบและแนวทางปัจจุบันของฉันพวกเขาเหมือนกันมาก
Frank

คำตอบ:


381

ทางเลือกอื่นสำหรับSystem.arraycopy:

String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class);

59
เฉพาะ Java 1.6 ขึ้นไป
newacct

10
การบริหารทรัพยากรมนุษย์ ฉันไม่สามารถทำให้มันใช้งานได้ซึ่งตัวอย่างแบบยาวของคำถามเดิมใช้ได้ มันพ่น java.lang.ArrayStoreException ฉันได้รับอาร์เรย์วัตถุจากวิธี toArray ใน ArrayList ทั่วไปที่มีประเภทที่กำหนดเองของฉัน สิ่งนี้ไม่คาดว่าจะทำงานกับยาชื่อสามัญหรือบางอย่าง?
Ian Varley

4
@Ian ปัญหาคือ objectArray มี Objects ไม่ใช่ Strings (ดู mmyers แสดงความคิดเห็นต่อคำตอบของฉันซึ่งทุกข์จากปัญหาเดียวกัน)
Yishai

3
ฉันลองใช้วิธีนี้และอย่างน้อยในกรณีของฉันฉันพบว่าการแสดงไม่ดีเท่าการสร้างชุดตัวเองด้วยการทำซ้ำ ( แต่น่าเสียดายที่ผมชอบมันเป็นหนึ่งซับ!)
mdup

1
@mdup - ซับในที่ค่อนข้างยาว ห่อด้วยวิธีการบางที
MasterJoe2

72

ใน Java 8:

String[] strings = Arrays.stream(objects).toArray(String[]::new);

วิธีแปลงอาเรย์ประเภทอื่น ๆ :

String[] strings = Arrays.stream(obj).map(Object::toString).
                   toArray(String[]::new);

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

วิธีนี้ใช้งานได้ แต่หากรายการของคุณมีค่า Null คุณจะได้รับ NullPointerException หากต้องการแก้ไขปัญหาดังกล่าวโปรดดูที่: stackoverflow.com/questions/4581407/…
Tony Falabella

61

System.arraycopy น่าจะเป็นวิธีที่มีประสิทธิภาพที่สุด แต่เพื่อความสวยงามฉันต้องการ:

 Arrays.asList(Object_Array).toArray(new String[Object_Array.length]);

10
ใช้งานได้เฉพาะในกรณีที่วัตถุทั้งหมดเป็นสตริง รหัสปัจจุบันของเขาใช้งานได้แม้ว่าพวกเขาจะไม่
Michael Myers

จุดดี. ฉันเข้าใจ toString ว่าเป็นเพียงวิธีในการส่งสตริงเท่านั้นไม่ใช่ความตั้งใจที่จะแทนที่วัตถุด้วยสิ่งอื่น หากนั่นคือสิ่งที่คุณต้องทำการวนซ้ำเป็นวิธีเดียว
Yishai

มันไม่ทำงานใน Android 2.3.3 .. มันทำให้ฉันมีข้อผิดพลาดบอกว่าวิธีการ copyof ไม่ได้กำหนด ฉันนำเข้าไฟล์ที่ถูกต้องทั้งหมด (ctrl + shift + I) .. แต่ก็ยังไม่ทำงาน
user590849

3
@ user590849 copyofคำตอบของฉันไม่ได้ใช้ คุณหมายถึงคำตอบอื่นหรือไม่?
Yishai

50

ฉันเห็นว่ามีการแก้ปัญหาบางอย่าง แต่ไม่มีสาเหตุใด ๆ ดังนั้นฉันจะอธิบายอย่างละเอียดเนื่องจากฉันเชื่อว่าการรู้ว่าคุณกำลังทำอะไรผิดที่สำคัญเพียงเพื่อให้ได้ "บางสิ่ง" ที่ได้ผลจากคำตอบที่ได้รับ

อันดับแรกให้ดูสิ่งที่ Oracle พูด

 * <p>The returned array will be "safe" in that no references to it are
 * maintained by this list.  (In other words, this method must
 * allocate a new array even if this list is backed by an array).
 * The caller is thus free to modify the returned array.

มันอาจดูไม่สำคัญ แต่อย่างที่คุณเห็นมันคือ ... ดังนั้นบรรทัดต่อไปนี้จึงล้มเหลว? วัตถุทั้งหมดในรายการเป็นสตริง แต่ไม่ได้แปลงทำไม?

List<String> tList = new ArrayList<String>();
tList.add("4");
tList.add("5");
String tArray[] = (String[]) tList.toArray();   

อาจเป็นไปได้ว่าหลายคนคิดว่ารหัสนี้ทำแบบเดียวกัน แต่ก็ไม่ได้

Object tSObjectArray[] = new String[2];
String tStringArray[] = (String[]) tSObjectArray;

เมื่อในความเป็นจริงรหัสที่เขียนจะทำอะไรเช่นนี้ javadoc กำลังพูดมัน! มันจะสร้างอาเรย์ใหม่สิ่งที่จะเป็นของวัตถุ !!!

Object tSObjectArray[] = new Object[2];
String tStringArray[] = (String[]) tSObjectArray;   

ดังนั้น tList.toArray กำลังทำให้วัตถุเป็นอินสแตนซ์ไม่ใช่ Strings ...

ดังนั้นทางออกธรรมชาติที่ไม่ได้กล่าวถึงในหัวข้อนี้ แต่เป็นสิ่งที่ Oracle แนะนำคือต่อไปนี้

String tArray[] = tList.toArray(new String[0]);

หวังว่ามันชัดเจนพอ


ประสิทธิภาพการแก้ไขเล็กน้อยที่ชาญฉลาด: String tArray [] = tList.toArray (String ใหม่ [tList.size ()]); มิฉะนั้นอาร์เรย์จะต้องมีการปรับขนาดอีกครั้ง ...
Lonzak

1
คำอธิบายที่ดี อีกสิ่งหนึ่งถ้าการใช้หน่วยความจำหรือประสิทธิภาพเป็นปัญหาอย่าทำซ้ำอาร์เรย์ ไม่ว่าจะเป็นการโยนองค์ประกอบใน String เมื่อใดก็ตามที่คุณต้องการ(String)Object_Array[i]หรือObject_Array[i].toString()หรือจัดสรรอาร์เรย์เป็นอาร์เรย์สตริงObject Object_Array[]=new String[100];... รับค่า ... จากนั้นจึงทำการแคสต์String_Array=(String[])Object_Arrayซึ่งตอนนี้ใช้งานได้แล้ว
Solostaran14 14

1
ArrayStoreException
iltaf khalid

7

กรอบการทำงานของคอลเลกชัน google เสนอวิธีการแปลงที่ดีเพื่อให้คุณสามารถแปลงวัตถุของคุณเป็นสตริง ข้อเสียเพียงอย่างเดียวคือมันต้องมาจาก Iterable ถึง Iterable แต่นี่คือวิธีที่ฉันจะทำ:

Iterable<Object> objects = ....... //Your chosen iterable here
Iterable<String> strings = com.google.common.collect.Iterables.transform(objects, new Function<Object, String>(){
        String apply(Object from){
             return from.toString();
        }
 });

นี่นำคุณออกไปจากการใช้อาร์เรย์ แต่ฉันคิดว่านี่จะเป็นวิธีที่ฉันชอบ


1
@Yishai: ไม่อาร์เรย์ไม่ได้ใช้ Iterable การทำซ้ำสำหรับพวกเขานั้นถูกกำหนดเป็นพิเศษใน JLS
newacct

@ newacct ค่อนข้างจริงฉันหมายถึงอาร์เรย์สามารถห่อได้อย่างง่ายดายใน Iterable (Arrays.asList ()) ฉันไม่รู้ว่าทำไมมันออกมาแบบนั้น
Yishai

5

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

หากคุณทราบว่าอาเรย์ Object ของคุณมีเฉพาะ Strings คุณสามารถทำได้เช่นกัน (เริ่มจากการเรียก toString ())

for (int i=0;i<String_Array.length;i++) String_Array[i]= (String) Object_Array[i];

กรณีเดียวเมื่อคุณสามารถใช้ cast to String [] ของ Object_Array จะเป็นถ้าอาร์เรย์ที่การอ้างอิงนั้นจะถูกกำหนดเป็น String [] เช่นนี้จะทำงาน:

    Object[] o = new String[10];
    String[] s = (String[]) o;

5

อันนี้ดี แต่ใช้งานไม่ได้ตามที่ mmyers สังเกตเพราะวงเล็บเหลี่ยม:

Arrays.toString(objectArray).split(",")

อันนี้น่าเกลียด แต่ใช้ได้:

Arrays.toString(objectArray).replaceFirst("^\\[", "").replaceFirst("\\]$", "").split(",")

หากคุณใช้รหัสนี้คุณต้องแน่ใจว่าสตริงที่ส่งคืนโดย toString () ของวัตถุของคุณไม่มีเครื่องหมายจุลภาค


1
คำแนะนำที่น่าสนใจ แต่คุณต้องลบ [และ] ในองค์ประกอบแรกและองค์ประกอบสุดท้าย
Michael Myers

1
งดงามจนกว่ามันจะทำงานได้ดี :)
AZ_

2
วิธีนี้ใช้ไม่ได้หากสตริงใด ๆ มีเครื่องหมายจุลภาค (,)
Andreas Berger

2

สำหรับความคิดของคุณจริง ๆ แล้วคุณกำลังประสบความสำเร็จ แต่ถ้าคุณทำเช่นนี้ควรจะดี:

for (int i=0;i<String_Array.length;i++) String_Array[i]=(String)Object_Array[i];

BTW โดยใช้วิธีการอรรถประโยชน์ Arrays ค่อนข้างดีและทำให้รหัสสง่า



1

คุณสามารถใช้ตัวแปลงชนิด ในการแปลงอาเรย์ประเภทใด ๆ เป็นอาเรย์ของสตริงคุณสามารถลงทะเบียนตัวแปลงของคุณเอง:

 TypeConverter.registerConverter(Object[].class, String[].class, new Converter<Object[], String[]>() {

        @Override
        public String[] convert(Object[] source) {
            String[] strings = new String[source.length];
            for(int i = 0; i < source.length ; i++) {
                strings[i] = source[i].toString();
            }
            return strings;
        }
    });

และใช้มัน

   Object[] objects = new Object[] {1, 23.43, true, "text", 'c'};
   String[] strings = TypeConverter.convert(objects, String[].class);

0

เปลี่ยนได้อย่างง่ายดายโดยไม่ต้อง headche แปลงออบเจกต์อาเรย์ใด ๆ เป็นอาเรย์สตริง Object drivex [] = {1,2};

    for(int i=0; i<drive.length ; i++)
        {
            Str[i]= drivex[i].toString();
            System.out.println(Str[i]); 
        }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.