Java 8中如何将二维数组转为List<List<Integer>>及杨辉三角代码补全
Java 8 二维数组转 List<List> 及杨辉三角代码修复
嘿,我来帮你搞定这两个问题,先从你贴的杨辉三角代码说起吧!
你的杨辉三角代码:return 语句该填什么?
首先得指出一个小问题:你当前定义的 Integer[][] a 是 numRows × numRows 的二维数组,但杨辉三角的第 i 行(从0开始数)只有 i+1 个有效元素,剩下的位置都是 null。如果直接转成 List 的话,会把这些 null 也包含进去,这显然不符合题目要求。
方案1:直接处理现有数组(保留你当前的数组定义)
我们可以用 Stream API 过滤掉每行的 null 元素,再收集成 List:
return Arrays.stream(a) .map(row -> Arrays.stream(row) .filter(Objects::nonNull) // 过滤掉空值 .collect(Collectors.toList())) .collect(Collectors.toList());
方案2:优化数组定义(更高效,推荐)
其实你完全可以在初始化数组时,让每行的长度刚好等于该行的元素个数,这样就不会产生多余的 null 了。修改后的完整代码如下:
class Solution { public List<List<Integer>> generate(int numRows) { Integer[][] a = new Integer[numRows][]; // 只指定行数,列数后续逐个定义 for(int i=0;i<numRows;i++) { a[i] = new Integer[i+1]; // 第i行有i+1个元素 a[i][0] = 1; a[i][i] = 1; // 单独处理首尾的1,不用嵌套循环判断 for(int j=1;j<i;j++) { // 只处理中间的元素 a[i][j] = a[i-1][j-1] + a[i-1][j]; } } // 这时候直接转换就行,没有多余的null return Arrays.stream(a) .map(Arrays::asList) .collect(Collectors.toList()); } }
通用问题:Java 8 中如何将二维数组转成 List<List>?
如果你的二维数组每行都是完整的(没有多余的空值),可以用下面两种方式:
方式1:生成固定大小的 List(基于原数组)
Arrays.asList() 返回的 List 是和原数组绑定的,不能添加/删除元素,但好处是无需额外内存开销:
Integer[][] arr = ...; // 你的二维数组 List<List<Integer>> list = Arrays.stream(arr) .map(Arrays::asList) .collect(Collectors.toList());
方式2:生成可变的 ArrayList(可修改)
如果需要后续对 List 进行增删操作,可以把每行转成 ArrayList:
Integer[][] arr = ...; List<List<Integer>> list = Arrays.stream(arr) .map(row -> new ArrayList<>(Arrays.asList(row))) .collect(Collectors.toList());
内容的提问来源于stack exchange,提问作者Dhondi Pranav
相关产品推荐
相关产品推荐

