0

I have written this code, but at run time I have this error:

[Ljava.lang.Object; cannot be cast to [[Ljava.lang.String; please help me, thanks!!!

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

5 回答 5

3

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

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

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

由于mergedListhas type List<List<String>>mergedList.toArray()has type List<String>[],即它是一个列表数组,而不是一个双索引数组。

于 2013-05-22T10:45:50.033 回答
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]不足以容纳列表元素)。但坦率地说,除非这是一个性能关键循环,否则我更喜欢第一个版本,因为我发现它更清楚地看到发生了什么。

于 2013-05-22T10:56:03.857 回答
0

嘿,您不能直接将多维字符串列表转换为字符串数组。在尝试使用 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]);
 }

这应该可以解决问题

于 2013-05-22T10:56:44.423 回答
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;
}
于 2013-05-22T10:56:59.493 回答
-2

您无法转换

List<List<String>>

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

List<String[]>. 
于 2013-05-22T10:46:04.560 回答