我试图将嵌套列表转换为二维数组。
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();
有没有办法有效?请注意,直到运行时我才知道列表的大小,并且它可能是锯齿状的。
答案 0 :(得分:17)
你可以这样做:
String[][] array = list.stream()
.map(l -> l.stream().toArray(String[]::new))
.toArray(String[][]::new);
它会从您的列表列表中创建Stream<List<String>>
,然后从中使用map
将每个列表替换为一个字符串数组,从而产生Stream<String[]>
,然后最终调用toArray
(使用生成器函数,而不是无参数版本)来生成String[][]
。
答案 1 :(得分: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()]);
}
(如果您使用带有Alex did的流的Java 8,则可以缩短此代码。)
答案 2 :(得分:0)
这是将2d列表转换为2d数组的最佳,最有效的方法;
List<List<Integer>> list2d = new ArrayList<>();
Integer[][] array2d;
array2d = list2d.stream().map(x->x.toArray(new Integer[x.size()])).toArray(Integer[][]::new);
答案 3 :(得分:-1)
比亚历克斯的答案稍微简短:
final List<List<String>> list = ...;
final String[][] array = list.stream().map(List::toArray).toArray(String[][]::new);