다음 코드를 사용하여 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 ()에 의해 반환 된 문자열에 쉼표가 포함되지 않아야합니다.