【问题标题】:How can I transform a List of List (multidimensional List) to an Array of Array(multidimensional Array)?如何将列表列表(多维列表)转换为数组数组(多维数组)?
【发布时间】:2013-05-17 09:07:54
【问题描述】:

我已经写了这段代码,但是在运行时我有这个错误:

[Ljava.lang.Object; cannot be cast to [[Ljava.lang.String; 请帮帮我,谢谢!!!

public  java.util.List<String>  concatAll(java.util.List<java.util.List<String>> mergedList) {



    java.lang.String [][] mergedArray = (String[][])mergedList.toArray();

    Iterator<java.util.List<String>> itr = mergedList.iterator();  
    java.util.List<String> list1 = itr.next();

          java.lang.String [] firstArray = (String[])list1.toArray();           

        int totalLength = firstArray.length;
          for (String[] array : mergedArray) {
            totalLength += array.length;
          }
          String[] result = Arrays.copyOf(firstArray, totalLength);
          int offset = firstArray.length;
          for (String[] array : mergedArray) {
            System.arraycopy(array, 0, result, offset, array.length);
            offset += array.length;
          }
          java.util.List<String> finalList = Arrays.asList(result);
          for (String list : finalList)
              System.out.println(list);

    return finalList;
}

【问题讨论】:

标签: java arrays string multidimensional-array arraylist


【解决方案1】:

mergedList.toArray() 创建一个单索引数组,类型为对象。

它包含的每个对象实际上都是一个(单索引的)字符串列表,尽管在这种调用语法中,类型在编译时是未知的。它不是一个字符串数组,因为你的演员需要工作。

由于您的concatAll 试图通过某种连接操作将List&lt;List&lt;String&gt;&gt; 转换为List&lt;String&gt;,因此最好不要转换为String[][],但如果您这样做了想要那个转换,可以按如下方式进行:

private String[][] toDoubleIndexArray(List<List<String>> mergedList) {
    String[][] result = new String[mergedList.size()][];
    for (int i = 0; i< mergedList.size(); i++) {
        List<String> currentList =  mergedList.get(i);
        result[i] = currentList.toArray(new String[currentList.size()]);
    }
    return result;
}

原始答案,如 Xavi Lopez 在 cmets 中指出的不完全正确:

由于mergedList 具有类型List&lt;List&lt;String&gt;&gt;mergedList.toArray() 的类型为 List&lt;String&gt;[],即它是一个列表数组,而不是一个双索引数组。

【讨论】:

  • mergedList.toArray() 不会是 Object[] 类型吗? mergedList.toArray(new List[0]) 不会给 List[] 吗?
  • 实际上,是的,您会丢失类型信息。我会更新的。
【解决方案2】:

你不能转换一个

List<List<String>>

使用开箱即用的 toArray 功能到 String[][]。这只有在你有以下情况下才有效:

List<String[]>. 

【讨论】:

  • 是否可以在列表字符串列表和多维字符串数组之间进行转换?是的,当然你可以,只要你写一些自定义的逻辑。你不能像你尝试的那样通过 toArray 来做到这一点,除非它是一个字符串数组列表
【解决方案3】:

没有开箱即用的方法,但手动操作相当简单:

// Create the outer dimension of the array, with the same size as the total list
String[][] mergedArray = new String[mergedList.size()][];

// Now iterate over each nested list and convert them into the String[]
// instances that form the inner dimension
for (int i = 0; i < mergedList.size(); i++) {
    mergedArray[i] = mergedList.get(i).toArray(new String[0]);
}

循环体的一个更有效的版本是

List<String> innerList = mergedList.get(i);
String[] innerAsArray = innerList.toArray(new String[innerList.size()]);
mergedArray[i] = innerAsArray;

因为这避免了在我的初始示例中需要调整数组大小(new String[0] 不足以容纳列表元素)。但坦率地说,除非这是一个性能关键的循环,否则我更喜欢第一个版本,因为我发现它更清楚地看到发生了什么。

【讨论】:

    【解决方案4】:

    您不能直接将多维字符串列表转换为字符串数组。在尝试使用 mergeArray 之前添加以下代码:

    /** Create Array **/     
    String [][] mergedArray = new String[mergedList.size()][];
    
    /** Initialize array from list **/  
    for(int i=0; i< mergedList.size(); i++){
         mergedArray[i] = mergedList.get(i).toArray(new String[0]);
     }
    

    这应该可以解决问题

    【讨论】:

      【解决方案5】:

      如果你的意图是返回一个数组,我认为你的返回类型是错误的。

      试试这个:

      public String[][] concatAll(java.util.List<java.util.List<String>> mergedList) {
      
          //java.lang.String [][] mergedArray = (String[][])mergedList.toArray();
          java.lang.String[][] mergedArray = new String[mergedList.size()][];
      
          Iterator<java.util.List<String>> itr = mergedList.iterator();
          int count = 0;
          while (itr.hasNext())
          {
              java.util.List<String> list1 = itr.next();
              String[] array1 = list1.toArray(new String[list1.size()]);
              mergedArray[count++] = array1;
          }
      
      
      return mergedArray;
      }
      

      【讨论】:

        猜你喜欢
        • 2012-04-04
        • 2015-08-18
        • 2019-06-25
        • 2021-04-15
        • 2015-12-30
        • 2020-03-24
        • 2010-12-27
        • 2016-10-14
        • 2014-11-26
        相关资源
        最近更新 更多