如何在Java中将对象数组转换为字符串数组

Fra*_*ank 236 java arrays string

我使用以下代码将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();
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有另一种方法可以做到这一点,例如:

String_Array=(String[])Object_Array;
Run Code Online (Sandbox Code Playgroud)

但这会导致运行时错误: Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

这样做的正确方法是什么?

wax*_*ing 373

另一种选择System.arraycopy:

String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class);
Run Code Online (Sandbox Code Playgroud)

  • 仅适用于Java 1.6及更高版本 (59认同)
  • 人力资源管理.我无法让这个工作,原始问题中的长形式示例确实有效.它抛出java.lang.ArrayStoreException.我在包含我的自定义类型的通用ArrayList上从toArray方法获取对象数组.这不是预期与泛型或其他东西一起工作吗? (9认同)
  • @Ian,问题是objectArray包含Objects而不是字符串(请参阅mmyers对我的答案的评论,该答案会遇到同样的问题). (4认同)
  • 我只是尝试了这种方法,至少在我的情况下,我发现性能不如通过迭代自己构建数组那么好.(太糟糕了,我喜欢它作为一个单行!) (3认同)

Vit*_*nko 63

在Java 8中:

String[] strings = Arrays.stream(objects).toArray(String[]::new);
Run Code Online (Sandbox Code Playgroud)

要转换其他类型的数组:

String[] strings = Arrays.stream(obj).map(Object::toString).
                   toArray(String[]::new);
Run Code Online (Sandbox Code Playgroud)

  • 这是一项美丽的工作,并且满足了能够将非String对象数组美学地转换为其toString等效数组的要求。当前接受的答案无法完成此操作。 (2认同)
  • 这有效,但如果您的列表包含空值,您将收到 NullPointerException。要解决该问题,请参阅:/sf/ask/320698521/ (2认同)

Yis*_*hai 60

System.arraycopy可能是最有效的方式,但对于美学,我更喜欢:

 Arrays.asList(Object_Array).toArray(new String[Object_Array.length]);
Run Code Online (Sandbox Code Playgroud)

  • 只有当对象都是字符串时才有效; 他现在的代码即使不是. (10认同)
  • @ user590849,我的回答不使用`copyof`.你在提到另一个答案吗? (3认同)

小智 49

我看到已经提供了一些解决方案,但没有任何原因,所以我将详细解释这一点,因为我认为知道你做错了什么同样重要,只是为了从给定的回复中得到"某些东西".

首先,让我们看看Oracle有什么话要说

 * <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.
Run Code Online (Sandbox Code Playgroud)

它可能看起来不重要,但正如你将看到的那样......那么以下行是什么失败了?列表中的所有对象都是String但它不会转换它们,为什么?

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

也许你们中的许多人会认为这段代码也是如此,但事实并非如此.

Object tSObjectArray[] = new String[2];
String tStringArray[] = (String[]) tSObjectArray;
Run Code Online (Sandbox Code Playgroud)

实际上,编写的代码正在做这样的事情.javadoc说的是!它将实现一个新的数组,它将是什么对象!

Object tSObjectArray[] = new Object[2];
String tStringArray[] = (String[]) tSObjectArray;   
Run Code Online (Sandbox Code Playgroud)

所以tList.toArray实例化一个对象而不是字符串......

因此,这个线程中没有提到的自然解决方案,但Oracle推荐的是以下内容

String tArray[] = tList.toArray(new String[0]);
Run Code Online (Sandbox Code Playgroud)

希望它足够清楚.


Ric*_*ard 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();
        }
 });
Run Code Online (Sandbox Code Playgroud)

这会让你远离使用数组,但我认为这将是我的首选方式.


dav*_* a. 5

如果你想获得数组中对象的String表示,那么是的,没有其他方法可以做到这一点.

如果你知道你的Object数组只包含字符串,你也可以这样做(调用toString()的instread:)

for (int i=0;i<String_Array.length;i++) String_Array[i]= (String) Object_Array[i];
Run Code Online (Sandbox Code Playgroud)

唯一可以使用强制转换为Object_Array的String []的情况是它引用的数组实际上是否定义为String [],例如这可以工作:

    Object[] o = new String[10];
    String[] s = (String[]) o;
Run Code Online (Sandbox Code Playgroud)


Ily*_*din 5

这个很好,但是因为方括号而不像mmyers注意到的那样:

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

这个很丑,但有效:

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

如果使用此代码,则必须确保对象的toString()返回的字符串不包含逗号.

  • 如果任何String包含逗号(,),则不起作用 (2认同)