将嵌套列表转换为 2d 数组

我正在尝试将嵌套列表转换为2d数组。

List<List<String>> list = new ArrayList<>();

list.add(Arrays.asList("a", "b", "c"));
list.add(Arrays.asList("dd"));
list.add(Arrays.asList("eee", "fff"));

我想把它变成一个.我尝试了以下方法:String[][]

String[][] array = (String[][]) list.toArray();      // ClassCastException

String[][] array = list.toArray(new String[3][3]);   // ArrayStoreException

String[][] array = (String[][]) list.stream()        // ClassCastException
    .map(sublist -> (String[]) sublist.toArray()).toArray();

有没有办法工作?请注意,在运行时之前,我不会知道列表的大小,并且它可能是锯齿状的。


答案 1

你可以这样做:

String[][] array = list.stream()
    .map(l -> l.stream().toArray(String[]::new))
    .toArray(String[][]::new);

它从您的列表列表中创建一个,然后从该列表中使用map将每个列表替换为一个字符串数组,从而产生一个,然后最终调用Array(使用生成器函数,而不是无参数版本)以产生.Stream<List<String>>Stream<String[]>String[][]


答案 2

没有简单的内置方法来做你想做的事情,因为你只能返回存储在列表中的元素数组,在你的情况下,这也是列表。list.toArray()

最简单的解决方案是创建二维数组,并用每个嵌套列表的结果填充它。toArray

String[][] array = new String[list.size()][];

int i = 0;
for (List<String> nestedList : list) {
    array[i++] = nestedList.toArray(new String[nestedList.size()]);
}

(如果您像 Alex 一样将 Java 8 与流一起使用,则可以缩短此代码)


推荐