Java中2D List转2D ArrayList及矩阵对角线绝对差实现求助
搞定2D List转2D ArrayList,顺便修正对角线差值计算的问题
嘿,我来帮你理清楚这个问题,先解决你最关心的2D List转2D ArrayList的部分,然后再把你代码里的bug给修正掉~
一、2D List转2D ArrayList超简单
其实根本不用复杂的循环,因为ArrayList本身就是List接口的实现类,直接用它的构造方法就能一键转换:
// 直接把原2D List丢进ArrayList的构造器,一步到位 List<List<Integer>> arrList = new ArrayList<>(arr);
要是你需要对每一行做额外处理(比如过滤某些元素),那可以手动逐行复制:
List<List<Integer>> arrList = new ArrayList<>(); for (List<Integer> row : arr) { // 这里可以加对row的处理逻辑,比如row.removeIf(num -> num < 0); arrList.add(new ArrayList<>(row)); }
二、你的对角线计算代码有几个小问题,我帮你改好
先说说你代码里的坑:
- 拼写错误:
List<List<Intger>>里的Intger应该是Integer,这个编译肯定过不了 - 对角线判断逻辑错误:
if (a[i] == a[j])是在比较数组对象,不是索引相等;而且取值应该是a[i][j],不是a[i](a[i]是整行数组,不是单个元素) - 嵌套循环完全没必要,一条循环就能搞定两条对角线的求和,不用遍历所有元素
修正后的完整代码(包含转换步骤)
public static int diagonalDifference(List<List<Integer>> arr) { // 2D List转2D ArrayList List<List<Integer>> arrList = new ArrayList<>(arr); // 2D ArrayList转int[][]数组 int[][] matrix = new int[arrList.size()][]; for (int i = 0; i < arrList.size(); i++) { List<Integer> row = arrList.get(i); // 两种转数组的方式都可以,选你习惯的 matrix[i] = row.toArray(new int[row.size()]); // 或者用stream:matrix[i] = row.stream().mapToInt(Integer::intValue).toArray(); } // 计算两条对角线的和 int primarySum = 0; int secondarySum = 0; int n = matrix.length; for (int i = 0; i < n; i++) { primarySum += matrix[i][i]; // 主对角线:行号=列号 secondarySum += matrix[i][n - i - 1]; // 副对角线:列号 = 总长度-1-行号 } return Math.abs(primarySum - secondarySum); }
额外偷懒技巧:其实可以跳过转换步骤
要是你只是为了计算对角线差值,根本没必要转成ArrayList或者数组,直接操作原List<List<Integer>>就行,代码更简洁:
public static int diagonalDifference(List<List<Integer>> arr) { int primarySum = 0; int secondarySum = 0; int n = arr.size(); for (int i = 0; i < n; i++) { primarySum += arr.get(i).get(i); secondarySum += arr.get(i).get(n - i - 1); } return Math.abs(primarySum - secondarySum); }
这个版本省去了两次转换的开销,运行效率更高,代码也更清爽~
内容的提问来源于stack exchange,提问作者kodazys
相关产品推荐
相关产品推荐

