Java 二维数组如何计算每行、每列及所有元素的和?
数据阿明
可以使用嵌套 for 循环遍历数组。每访问一个元素,就用 += 将它加到当前行的和、对应列的和以及总和中,无需额外调用求和方法。
示例数组中各行长度不同,内层循环需要使用 arr[i].length。按列下标累加时,第 5 列只有第三行的 13。
累加变量应该放在哪里?
代码需要保存三类结果:
rowSum:当前行的和。在外层循环内部定义,每开始一行就重新设为0。columnSums[j]:第j列的和。在循环外创建数组,保存各列的累加结果。totalSum:所有元素的总和。在循环外定义,遍历时持续累加。
由于各行长度不同,可以先遍历各行,找出最大长度,再据此创建 columnSums。新建的 int[] 元素默认都是 0。
完整代码
public class arrays {
public static void main(String[] args) {
int[][] arr = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12, 13}
};
// Find the maximum number of columns.
int maxColumns = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i].length > maxColumns) {
maxColumns = arr[i].length;
}
}
int[] columnSums = new int[maxColumns];
int totalSum = 0;
// Calculate row sums, column sums, and the total sum.
for (int i = 0; i < arr.length; i++) {
int rowSum = 0;
for (int j = 0; j < arr[i].length; j++) {
int value = arr[i][j];
rowSum += value;
columnSums[j] += value;
totalSum += value;
}
System.out.println("Row [" + i + "] sum = " + rowSum);
}
for (int j = 0; j < columnSums.length; j++) {
System.out.println(
"Column [" + j + "] sum = " + columnSums[j]
);
}
System.out.println("Total sum = " + totalSum);
}
}
题目中数组的输出结果是:
Row [0] sum = 10
Row [1] sum = 26
Row [2] sum = 55
Column [0] sum = 15
Column [1] sum = 18
Column [2] sum = 21
Column [3] sum = 24
Column [4] sum = 13
Total sum = 91
为什么要使用当前行的长度?
Java 的二维数组可以理解为“存放数组的数组”。arr.length 是行数,arr[i].length 是第 i 行的元素数量,arr[i][j] 是该行中下标为 j 的元素。
如果内层循环使用 arr[0].length,就会漏掉第三行末尾的 13。如果所有行都按最大列数访问,访问前两行的 arr[i][4] 时会发生 ArrayIndexOutOfBoundsException。使用 j < arr[i].length 可以遍历每行实际存在的元素。
例如,遍历到 arr[1][2],也就是 7 时,以下三行代码分别更新第二行、第三列和整个数组的累计值:
rowSum += value;
columnSums[j] += value;
totalSum += value;
其中,rowSum += value 等价于 rowSum = rowSum + value。
使用时的注意事项
这份代码适用于数组本身及各行均非 null 的情况。空行的长度为 0,内层循环会直接跳过,该行的和为 0。如果某行可能为 null,需要先判断,再访问它的 length。
题目中的数值使用 int 足够。如果实际数据的累计值可能超出 int 范围,可以将 rowSum、totalSum 改成 long,并将列累加数组改为 long[]。
备注:内容仅供参考。
