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[][].
没有简单的内置方法可以执行您想要的操作,因为您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,你可以缩短这段代码)