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.