Cách chuyển đổi mảng đối tượng thành mảng chuỗi trong Java


244

Tôi sử dụng đoạn mã sau để chuyển đổi một mảng Object thành mảng String:

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

Nhưng tôi tự hỏi nếu có một cách khác để làm điều này, một cái gì đó như:

String_Array=(String[])Object_Array;

Nhưng điều này sẽ gây ra lỗi thời gian chạy: Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

Cách chính xác để làm điều đó là gì?


3
Tôi thích câu trả lời hay nhất của waxwing: String [] stringArray = Arrays.copyOf (objectArray, objectArray.length, String []. Class); Nó rất súc tích và hoạt động. Tôi đã tính bao nhiêu thời gian cho cả câu trả lời của anh ấy và cách tiếp cận hiện tại của tôi, chúng khá giống nhau.
Frank

Câu trả lời:


381

Một cách khác để System.arraycopy:

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

59
chỉ trên Java 1.6 trở lên
newacct

10
Hrm. Tôi không thể làm cho cái này hoạt động, trong đó ví dụ dạng dài trong câu hỏi ban đầu không hoạt động. Nó ném java.lang.ArrayStoreException. Tôi nhận được mảng đối tượng từ phương thức toArray trên một ArrayList chung có chứa loại tùy chỉnh của tôi. Đây có phải là không mong đợi để làm việc với thuốc generic hay cái gì đó?
Ian Varley

4
@Ian, vấn đề là objectArray có chứa các đối tượng không phải là Chuỗi (xem phần bình luận của mmyer cho câu trả lời của tôi bị vấn đề tương tự).
Yishai

3
Tôi vừa thử phương pháp này và, ít nhất là trong trường hợp của tôi, tôi phát hiện ra rằng hiệu suất không tốt bằng việc tự xây dựng mảng bằng cách lặp. (Mặc dù quá tệ, tôi thích nó như một lớp lót!)
mdup

1
@mdup - Khá dài một lót. bọc nó trong một phương pháp có lẽ.
MasterJoe2

72

Trong Java 8:

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

Để chuyển đổi một mảng các loại khác:

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

2
Đây là một công việc tuyệt đẹp và đáp ứng yêu cầu về khả năng chuyển đổi một cách thẩm mỹ một mảng đối tượng không phải Chuỗi thành một mảng tương đương toString của chúng. Câu trả lời hiện được chấp nhận không thực hiện được điều này.
b4n4n4p4nd4

Điều này hoạt động nhưng nếu danh sách của bạn chứa null, bạn sẽ nhận được NullPulumException. Để giải quyết vấn đề đó, hãy xem: stackoverflow.com/questions/4581407/ từ
Tony Falabella

61

System.arraycopy có lẽ là cách hiệu quả nhất, nhưng về mặt thẩm mỹ, tôi thích:

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

10
Điều đó chỉ hoạt động nếu các đối tượng là tất cả các Chuỗi; mã hiện tại của anh ấy hoạt động ngay cả khi chúng không.
Michael Myers

Điểm tốt. Tôi hiểu toString chỉ là một cách truyền vào Chuỗi chứ không phải ý định thực sự thay thế các đối tượng bằng thứ khác. Nếu đó là những gì bạn cần làm, thì vòng lặp là cách duy nhất.
Yishai

Điều này không hoạt động trong Android 2.3.3 .. nó gây ra lỗi cho tôi rằng phương thức copyof không được xác định. Tôi đã nhập tất cả các tệp đúng (ctrl + shift + I) .. nhưng nó vẫn không hoạt động.
dùng590849

3
@ user590849, câu trả lời của tôi không sử dụng copyof. Bạn đang đề cập đến một câu trả lời khác?
Yishai

50

Tôi thấy rằng một số giải pháp đã được cung cấp nhưng không phải là bất kỳ nguyên nhân nào vì vậy tôi sẽ giải thích chi tiết điều này vì tôi tin rằng điều quan trọng là bạn phải làm gì sai chỉ để nhận "một cái gì đó" hoạt động từ các câu trả lời đã cho.

Đầu tiên, hãy xem Oracle nói gì

 * <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.

Nó có thể trông không quan trọng nhưng như bạn sẽ thấy ... Vậy dòng sau đây thất bại là gì? Tất cả các đối tượng trong danh sách là String nhưng nó không chuyển đổi chúng, tại sao?

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

Có lẽ, nhiều bạn sẽ nghĩ rằng mã này đang làm như vậy, nhưng thực tế không phải vậy.

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

Khi trong thực tế, mã viết đang làm một cái gì đó như thế này. Các javadoc đang nói nó! Nó sẽ tạo ra một mảng mới, nó sẽ là gì của các đối tượng !!!

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

Vì vậy, tList.toArray đang khởi tạo một Đối tượng chứ không phải Chuỗi ...

Do đó, giải pháp tự nhiên chưa được đề cập trong chủ đề này, nhưng đó là những gì Oracle khuyến nghị là như sau

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

Hy vọng nó là đủ rõ ràng.


Hiệu suất điều chỉnh nhẹ khôn ngoan: String tArray [] = tList.toArray (new String [tList.size ()]); Nếu không thì mảng phải được thay đổi kích thước một lần nữa ...
Lonzak

1
Lời giải thích hay. Chỉ một điều nữa, nếu tiêu thụ bộ nhớ hoặc hiệu suất là một vấn đề, không nhân đôi mảng. Hoặc đúc một phần tử trong chuỗi bất cứ khi nào bạn cần nó (String)Object_Array[i]hay Object_Array[i].toString()hoặc phân bổ mảng như một mảng chuỗi Object Object_Array[]=new String[100];... được giá trị ... sau đó đúc String_Array=(String[])Object_Arraymà hiện đang làm việc.
Solostaran14

1
điều này ném ArrayStoreException
iltaf khalid

7

Khung bộ sưu tập google cung cấp trích dẫn một phương thức chuyển đổi tốt, vì vậy bạn có thể chuyển đổi Đối tượng của mình thành Chuỗi. Nhược điểm duy nhất là nó phải từ Iterable sang Iterable nhưng đây là cách tôi sẽ làm:

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

Điều này đưa bạn đi từ việc sử dụng mảng, nhưng tôi nghĩ rằng đây sẽ là cách ưa thích của tôi.


1
@Yishai: không, mảng không thực hiện Iterable. Lặp lại trên chúng được xác định đặc biệt trong JLS
newacct

@newacct, khá đúng, ý tôi là mảng có thể dễ dàng được gói trong một Iterable (Arrays.asList ()). Tôi không biết tại sao nó lại xuất hiện theo cách đó.
Yishai

5

Nếu bạn muốn có được một đại diện Chuỗi của các đối tượng trong mảng của mình, thì có, không có cách nào khác để làm điều đó.

Nếu bạn biết mảng Object của bạn chỉ chứa các Chuỗi, bạn cũng có thể thực hiện (. Hướng dẫn gọi toString ()):

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

Trường hợp duy nhất khi bạn có thể sử dụng truyền vào Chuỗi [] của Object_Array sẽ là nếu mảng mà nó tham chiếu thực sự sẽ được định nghĩa là Chuỗi [], ví dụ: điều này sẽ hoạt động:

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

5

Cái này là tốt, nhưng không hoạt động như mmyer nhận thấy, bởi vì dấu ngoặc vuông:

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

Cái này xấu nhưng hoạt động:

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

Nếu bạn sử dụng mã này, bạn phải chắc chắn rằng các chuỗi được trả về bởi các đối tượng của bạn 'toString () không chứa dấu phẩy.


1
Đề xuất thú vị, nhưng trước tiên bạn phải xóa [và] trên các yếu tố đầu tiên và cuối cùng.
Michael Myers

1
tuyệt đẹp cho đến khi nó thực hiện công việc :)
AZ_

2
Điều này không hoạt động nếu bất kỳ Chuỗi nào có dấu phẩy (,)
Andreas Berger

2

Đối với ý tưởng của bạn, thực sự bạn đang tiếp cận thành công, nhưng nếu bạn làm như vậy thì sẽ ổn thôi:

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

BTW, sử dụng phương thức tiện ích Arrays khá tốt và làm cho mã thanh lịch.


1
Object arr3[]=list1.toArray();
   String common[]=new String[arr3.length];

   for (int i=0;i<arr3.length;i++) 
   {
   common[i]=(String)arr3[i];
  }

1

Bạn có thể sử dụng chuyển đổi loại . Để chuyển đổi một mảng của bất kỳ loại nào thành mảng chuỗi, bạn có thể đăng ký trình chuyển đổi của riêng mình:

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

và sử dụng nó

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

0

Dễ dàng thay đổi mà không cần bất kỳ headche Chuyển đổi bất kỳ mảng đối tượng thành mảng chuỗi Object drivex [] = {1,2};

    for(int i=0; i<drive.length ; i++)
        {
            Str[i]= drivex[i].toString();
            System.out.println(Str[i]); 
        }
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.