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

Ypn*_*ypn 10 java nested-lists multidimensional-array

我正在尝试将嵌套列表转换为二维数组.

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

list.add(Arrays.asList("a", "b", "c"));
list.add(Arrays.asList("dd"));
list.add(Arrays.asList("eee", "fff"));
Run Code Online (Sandbox Code Playgroud)

我想做这个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();
Run Code Online (Sandbox Code Playgroud)

有办法吗?请注意,我不会知道列表的大小,直到运行时,它可能是锯齿状的.

Ale*_*lex 20

你可以这样做:

String[][] array = list.stream()
    .map(l -> l.stream().toArray(String[]::new))
    .toArray(String[][]::new);
Run Code Online (Sandbox Code Playgroud)

Stream<List<String>>从你的列表列表中创建一个,然后从那里用来map用一个字符串数组替换每个列表,这些字符串导致a Stream<String[]>,然后最终调用toArray(使用生成器函数,而不是无参数版本)来生成这个String[][].

  • @fuat `list.stream() .map(l -&gt; l.stream().mapToDouble(Double::doubleValue).toArray()) .toArray(double[][]::new)` 如果列表是 `列表&lt;列表&lt;双&gt;&gt;`。如果任何 Double 为 null,它将抛出 NullPointerException。 (2认同)

Psh*_*emo 9

没有简单的内置方法可以执行您想要的操作,因为您toArray只能返回存储在列表中的元素数组,在您的情况下也可以是列表.

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

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

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

(如果你像使用Alex一样使用带有流的Java 8,你可以缩短这段代码)