非均匀行二维数组求最大列和的Java代码逻辑疑问
问题解答:Java非均匀二维数组的最大列和计算
核心结论
Java中的二维数组不需要是n×n的均匀结构,它本质是「数组的数组」——每一行都是一个独立的一维数组,长度可以自由设定,JVM不会自动为短行补全元素,也不会截断长行。
原代码的问题分析
你给出的Codecademy代码存在两个严重问题,仅适用于所有行长度完全一致的二维数组:
- 遗漏长行的额外列:外层循环以
arr2D[0].length作为列数上限,若后续行有更长的长度,超出第一行长度的列会被完全忽略,比如你示例中的第4、5列。 - 数组越界风险:如果存在比第一行更短的行,当循环到超过该行长度的列索引时,访问
arr2D[j][i]会直接抛出ArrayIndexOutOfBoundsException。
修正后的实现方案
要正确处理任意结构的二维数组,需要先确定数组的最大列数(即所有行中最长的那一行的长度),然后遍历每一列,对每一行判断当前列是否存在,不存在则按0计算贡献:
class LargestColumnSum { public static int largestColumn(int[][] arr2D) { if (arr2D == null || arr2D.length == 0) { return -1; // 处理空数组的边界情况 } // 第一步:找到最大列数(最长行的长度) int maxColumns = 0; for (int[] row : arr2D) { if (row.length > maxColumns) { maxColumns = row.length; } } int largestColumn = 0; int largestSum = Integer.MIN_VALUE; // 初始化为最小整数,避免全负数的情况 // 遍历每一列 for (int i = 0; i < maxColumns; i++) { int columnSum = 0; // 遍历每一行,计算当前列的和 for (int[] row : arr2D) { // 如果当前行长度大于列索引,就加对应元素,否则加0 if (i < row.length) { columnSum += row[i]; } // 否则默认加0,无需额外操作 } // 更新最大和及对应列索引 if (columnSum > largestSum) { largestSum = columnSum; largestColumn = i; } } return largestColumn; } public static void main(String[] args) { int[][] values = { {17, 13, 19, 22}, {12, 18, 25, 20}, {15, 18, 21, 24}, {19, 23, 23, 22}, {18, 20, 21, 26, 1000, 500} }; System.out.println(largestColumn(values)); // 输出4,对应第5列(索引从0开始) } }
关键细节说明
- 边界处理:增加了空数组的判断,避免空指针异常。
- 初始值设定:将
largestSum初始化为Integer.MIN_VALUE,确保即使所有列的和都是负数,也能正确找到最大值。 - 列存在性判断:通过
i < row.length判断当前行是否包含该列元素,避免数组越界。
内容的提问来源于stack exchange,提问作者codetechie
相关产品推荐
相关产品推荐

