将嵌套列表转换为2d数组
我正在尝试将嵌套列表转换为二维数组。
List<List> 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();
有办法吗? 请注意,我不会知道列表的大小,直到运行时,它可能是锯齿状的。
没有简单的内置方法可以执行您想要的操作,因为您的toArray
只能返回存储在列表中的元素数组,在您的情况下也可以是列表。
最简单的解决方案是创建二维数组并使用每个嵌套列表中的toArray
结果填充它。
String[][] array = new String[list.size()][]; int i = 0; for (List nestedList : list) { array[i++] = nestedList.toArray(new String[nestedList.size()]); }
(如果你像使用Alex一样使用带有流的Java 8,你可以缩短这段代码)
你可以这样做:
String[][] array = list.stream() .map(l -> l.stream().toArray(String[]::new)) .toArray(String[][]::new);
它从列表列表中创建一个Stream
,然后从那里使用>
map
用一个字符串数组替换每个列表,这些字符串导致一个Stream
,然后最终调用toArray
(带有一个生成String[][]
生成器函数,而不是无参数版本)。
比亚历克斯的回答略显简短:
final List> list = ...; final String[][] array = list.stream().map(List::toArray).toArray(String[][]::new);