我已编写此代码,但在运行时我遇到此错误:
[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;
}
答案 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[]>.