Java에서 객체 배열을 문자열 배열로 변환하는 방법


244

다음 코드를 사용하여 Object 배열을 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();

그러나 다른 방법이 있는지 궁금합니다.

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이 발생합니다. 내 사용자 정의 유형을 포함하는 일반 ArrayList의 toArray 메소드에서 객체 배열을 가져옵니다. 이것이 제네릭이나 다른 것과 함께 작동하지 않을 것으로 예상됩니까?
— Ian Varley

4
@ Ian의 문제는 objectArray에 문자열이 아닌 객체가 포함되어 있다는 것입니다 (mmyers는 내 문제에 대한 동일한 의견으로 답변합니다).
— Yishai

3
방금이 접근법을 시도했지만 적어도 내 경우에는 반복하여 배열을 직접 구축하는 것보다 성능이 좋지 않다는 것을 알았습니다. (너무 나쁘지만, 나는 하나의 라이너로 그것을 좋아했다!)
— mdup

1
@mdup-꽤 긴 라이너. 아마도 방법으로 포장하십시오.
— MasterJoe2

72

자바 8 :

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

다른 유형의 배열을 변환하려면

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

2
이것은 아름다움의 작품이며, 비 String 객체 배열을 toString 등가의 배열로 미학적으로 변환 할 수 있어야한다는 요구 사항을 충족시킵니다. 현재 받아 들여진 대답은 이것을 달성하지 못합니다.
— b4n4n4p4nd4

이것은 작동하지만 목록에 null이 포함되어 있으면 NullPointerException이 발생합니다. 이 문제를 해결하려면 다음을 참조하십시오. stackoverflow.com/questions/4581407/…
— Tony Falabella

61

System.arraycopy는 아마도 가장 효율적인 방법 일 것입니다.

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

10
객체가 모두 문자열 인 경우에만 작동합니다. 그의 현재 코드는 그렇지 않은 경우에도 작동합니다.
— 마이클 마이어스

좋은 지적. toString은 실제로 객체를 다른 것으로 바꾸려는 의도가 아니라 String으로 캐스팅하는 방법 인 것으로 이해했습니다. 그것이 당신이해야 할 일이라면, 루핑이 유일한 방법입니다.
— Yishai 2016 년

이것은 안드로이드 2.3.3.에서 작동하지 않습니다. 그것은 copyof 메소드가 정의되지 않았다는 오류를 발생시킵니다. 올바른 파일 (ctrl + shift + I)을 모두 가져 왔지만 여전히 작동하지 않습니다.
— user590849

3
@ user590849, 내 대답은을 사용하지 않습니다 copyof. 다른 답변을 참조하고 있습니까?
— Yishai

50

나는 어떤 해결책이 제공되었지만 어떤 원인도 제공하지 않았 음을 알기 때문에 주어진 답장에서 작동하는 "뭔가"를 얻는 것이 잘못되었다는 것을 아는 것이 중요하다고 생각하기 때문에 이것을 자세히 설명 할 것입니다.

먼저, 오라클의 의견을 살펴 보겠습니다

 * <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는 문자열이 아닌 객체를 인스턴스화합니다 ...

따라서이 스레드에서 언급하지 않았지만 Oracle이 권장하는 자연 솔루션은 다음과 같습니다.

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

충분히 명확하길 바랍니다.


약간의 수정 성능 현명 : String tArray [] = tList.toArray (new String [tList.size ()]); 그렇지 않으면 어레이의 크기를 다시 조정해야합니다.
— Lonzak

1
좋은 설명입니다. 메모리 소비 또는 성능에 문제가있는 경우 어레이를 복제하지 마십시오. 당신이 그것을 필요로 할 때마다 하나는 문자열의 요소를 캐스팅 (String)Object_Array[i]하거나 Object_Array[i].toString()또는 문자열 배열로 배열을 할당 Object Object_Array[]=new String[100];값을 얻을 ... 다음 캐스트 ... String_Array=(String[])Object_Array지금 작동한다.
— Solostaran14

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 배열에 문자열 만 포함되어 있다는 것을 알고 있다면 다음과 같이 할 수도 있습니다 (toString () 호출).

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

Object_Array의 캐스트 to String []을 사용할 수있는 유일한 경우는 참조하는 배열이 실제로 String []로 정의되는 경우입니다.

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

5

이것은 훌륭하지만 대괄호로 인해 mmyers가 알아 차린대로 작동하지 않습니다.

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

이것은 추악하지만 작동합니다.

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

이 코드를 사용하는 경우 객체의 toString ()에 의해 반환 된 문자열에 쉼표가 포함되지 않아야합니다.


1
흥미로운 제안이지만 먼저 첫 번째 요소와 마지막 요소에서 [와]를 제거해야합니다.
— 마이클 마이어스

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
Object arr3[]=list1.toArray();
   String common[]=new String[arr3.length];

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

1

type-converter를 사용할 수 있습니다 . 모든 유형의 배열을 문자열 배열로 변환하려면 자신의 변환기를 등록 할 수 있습니다.

 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

헤드 체없이 쉽게 변경 모든 개체 배열을 문자열 배열로 변환 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.