如何将List of List(多维列表)转换为Array of Array(多维数组)?

时间:2013-05-22 10:40:12

标签: java arrays string multidimensional-array arraylist

我已编写此代码,但在运行时我遇到此错误:

[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;
}

5 个答案:

答案 0 :(得分:3)

mergedList.toArray()创建一个单独编入索引的数组作为对象。

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

由于您的concatAll尝试通过某种连接操作将List<List<String>>转换为List<String>,因此最好不要转换为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在评论中所指出的那样:

由于mergedList的类型为List<List<String>>mergedList.toArray()的类型为List<String>[],即它是一个列表数组,而不是双重索引数组。

答案 1 :(得分:2)

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

// 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]不足以容纳列表元素)。但坦率地说,除非这是一个性能关键的循环,否则我更喜欢第一个版本,因为我发现它看起来有点清楚。

答案 2 :(得分:0)

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

/** 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]);
 }

这应该可以解决问题

答案 3 :(得分:0)

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

试试这个:

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

答案 4 :(得分:-2)

您无法转换

List<List<String>>

到String [] [],使用开箱即用的功能。这只有在你有:

时才有效
List<String[]>.