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

时间:2014-11-04 01:36:18

标签: java multidimensional-array nested-lists

我试图将嵌套列表转换为二维数组。

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();

有没有办法有效?请注意,直到运行时我才知道列表的大小,并且它可能是锯齿状的。

4 个答案:

答案 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);