如何在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
我最喜欢蜡雀鸟的答案:String [] stringArray = Arrays.copyOf(objectArray,objectArray.length,String []。class); 它非常简洁且有效。我计算了他的答案和当前方法所需的时间,它们几乎相同。
弗兰克(Frank)

Answers:


381

另一种替代方法System.arraycopy

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

59
仅在Java 1.6及更高版本上
newacct

10
嗯 我无法解决这个问题,原始问题中的长形式示例确实起作用。它引发java.lang.ArrayStoreException。我从包含我的自定义类型的通用ArrayList上的toArray方法获取对象数组。难道这不适用于泛型之类的东西吗?
伊恩·瓦利

4
@Ian,问题在于objectArray包含对象而不是字符串(请参见mmyers对我的回答的评论,该问题同样存在)。
Yishai 2010年

3
我只是尝试了这种方法,至少在我的情况下,我发现性能不如自己通过迭代来构建阵列好。(虽然太糟糕了,但我还是喜欢它作为
单线

1
@mdup-相当长的一个内衬。将其包装在一个方法中。
MasterJoe2'9

72

在Java 8中:

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

要转换其他类型的数组:

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

2
这是一项美丽的工作,并且满足了能够将非String对象数组美学地转换为其toString等效数组的要求。当前接受的答案无法完成此操作。
b4n4n4p4nd4 '18年

这行得通,但是如果您的列表包含null,则将收到NullPointerException。要解决这个问题,请参见:stackoverflow.com/questions/4581407/...
托尼法拉贝拉

61

System.arraycopy可能是最有效的方法,但是为了美观,我更喜欢:

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

10
仅当对象都是String时才有效;即使当前代码无效,他当前的代码仍然有效。
迈克尔·迈尔斯

好点子。我将toString理解为只是转换为String的一种方式,而不是实际上用其他东西替换对象的意图。如果那是您需要做的,那么循环是唯一的方法。
Yishai

这在Android 2.3.3。中不起作用。它给我一个错误,提示未定义copyof方法。我导入了所有正确的文件(ctrl + shift + I)。但是它仍然无法正常工作。
user590849 2012年

3
@ user590849,我的答案未使用copyof。您是在指另一个答案吗?
Yishai 2012年

50

我看到已经提供了一些解决方案,但没有提供任何原因,所以我将详细解释这一点,因为我相信知道您在做什么错是很重要的,只是为了从给定的答复中获得“成功”。

首先,让我们看看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.

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

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实例化一个Objects而不是Strings ...

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

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

希望它足够清楚。


略微校正性能:String tArray [] = tList.toArray(new String [tList.size()]); 否则必须重新调整数组的大小...
Lonzak 2014年

1
很好的解释。如果内存消耗或性能是一个问题,请不要再复制该阵列。无论是在串变成一个元素,当您需要它(String)Object_Array[i]Object_Array[i].toString()或数组分配的String数组Object Object_Array[]=new String[100];......这些价值观......再投String_Array=(String[])Object_Array现在的作品。
Solostaran14 2015年

1
这将引发
ArrayStoreException

7

Google Collections框架提供了一个引号不错的转换方法,因此您可以将Objects转换为Strings。唯一的缺点是必须从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 2010年

5

如果要获取数组中对象的String表示形式,则可以,没有其他方法可以实现。

如果您知道您的Object数组仅包含字符串,则也可以这样做(调用toString()的理解):

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

可以使用对Object_Array的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 2014年

2

对于您的想法,实际上您正在接近成功,但是如果您愿意,可以这样做:

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

顺便说一句,使用Arrays实用程序方法非常好,并使代码优雅。



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]); 
        }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.