【问题标题】:How to convert object array to string array in Java如何在Java中将对象数组转换为字符串数组
【发布时间】:2010-11-04 08:40:33
【问题描述】:

我使用以下代码将 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;

正确的做法是什么?

【问题讨论】:

  • 我最喜欢waxwing的回答:String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class);它非常简洁且有效。我计算了他的回答和我目前的方法需要多少时间,它们几乎相同。

标签: java arrays string


【解决方案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);

【讨论】:

    【解决方案2】:

    在 Java 8 中:

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

    转换其他类型的数组:

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

    【讨论】:

    • 这是一件精美的作品,满足了将非字符串对象数组转换为与其 toString 等价物的数组的要求。当前接受的答案无法做到这一点。
    • 这可行,但如果您的列表包含空值,您将获得 NullPointerException。要解决该问题,请参阅:stackoverflow.com/questions/4581407/…
    • 我在使用 Arrays.stream 时遇到 Android Studio IDE 错误。 “无法解析方法 'stream()'。我知道我使用的是正确版本的 Java。
    【解决方案3】:
    Object arr3[]=list1.toArray();
       String common[]=new String[arr3.length];
    
       for (int i=0;i<arr3.length;i++) 
       {
       common[i]=(String)arr3[i];
      }
    

    【讨论】:

      【解决方案4】:

      轻松更改,无需任何麻烦 将任何对象数组转换为字符串数组 对象驱动x[] = {1,2};

          for(int i=0; i<drive.length ; i++)
              {
                  Str[i]= drivex[i].toString();
                  System.out.println(Str[i]); 
              }
      

      【讨论】:

        【解决方案5】:

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

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

        它可能看起来并不重要,但正如您所看到的那样... 那么下面这行失败的原因是什么?列表中的所有对象都是字符串,但它不转换它们,为什么?

        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()]);否则数组必须再次调整大小...
        • 很好的解释。还有一件事,如果内存消耗或性能是一个问题,请不要复制数组。在需要时将元素转换为字符串 (String)Object_Array[i]Object_Array[i].toString() 或将数组分配为字符串数组 Object Object_Array[]=new String[100]; ...获取值 ...然后转换 String_Array=(String[])Object_Array 现在可以使用。
        • 这会抛出 ArrayStoreException
        【解决方案6】:

        对于您的想法,实际上您正在接近成功,但如果您这样做应该没问题:

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

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

        【讨论】:

          【解决方案7】:

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

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

          这个很丑但是很管用:

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

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

          【讨论】:

          • 有趣的建议,但您首先必须删除第一个和最后一个元素上的 [ 和 ]。
          • 华丽,直到它完成工作:)
          • 如果任何 String 包含逗号 (,),这将不起作用
          【解决方案8】:

          如果您想获得数组中对象的字符串表示形式,那么是的,没有其他方法可以做到。

          如果你知道你的对象数组只包含字符串,你也可以这样做(调用 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;
          

          【讨论】:

            【解决方案9】:

            System.arraycopy 的另一种选择:

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

            【讨论】:

            • 仅适用于 Java 1.6 及更高版本
            • 人力资源部。我无法让这个工作,原始问题中的长格式示例确实有效。它抛出 java.lang.ArrayStoreException。我从包含我的自定义类型的通用 ArrayList 上的 toArray 方法获取对象数组。预计这不适用于泛型或其他东西吗?
            • @Ian,问题是 objectArray 包含对象而不是字符串(请参阅 mmyers 对我的回答的评论,它遇到了同样的问题)。
            • 我刚刚尝试了这种方法,至少在我的情况下,我发现性能不如自己通过迭代构建数组。 (不过太糟糕了,我喜欢它作为单线!)
            • @mdup - 很长的一个班轮。也许将它包装在一个方法中。
            【解决方案10】:

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

            这使您不再使用数组,但我认为这将是我的首选方式。

            【讨论】:

            • @Yishai:不,数组不实现Iterable。在 JLS 中特别定义了对它们的迭代
            • @newacct,非常正确,我的意思是数组可以很容易地包装在一个 Iterable (Arrays.asList()) 中。我不知道为什么会这样。
            【解决方案11】:

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

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

            【讨论】:

            • 只有当对象都是字符串时才有效;即使不是,他当前的代码也可以工作。
            • 好点。我将 toString 理解为只是一种转换为字符串的方式,而不是用其他东西实际替换对象的意图。如果这是你需要做的,那么循环是唯一的方法。
            • 这在 Android 2.3.3 中不起作用。它给我一个错误,说没有定义 copyof 方法。我导入了所有正确的文件 (ctrl+shift+I).. 但它仍然不起作用。
            • @user590849,我的回答没有使用copyof。你指的是另一个答案吗?
            猜你喜欢
            • 1970-01-01
            • 2022-10-07
            • 2011-12-27
            • 2023-03-28
            • 1970-01-01
            • 2021-05-09
            • 1970-01-01
            相关资源
            最近更新 更多