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

다음 코드를 사용하여 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;

올바른 방법은 무엇입니까?



답변

다른 대안 System.arraycopy:

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


답변

자바 8 :

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

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

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


답변

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

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


답변

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

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

 * <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]);

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


답변

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

이것은 배열을 사용하지 못하게하지만 이것이 내가 선호하는 방법이라고 생각합니다.


답변

배열에서 객체의 문자열 표현을 얻으려면 다른 방법이 없습니다.

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;


답변

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

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

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

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

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