
本文介绍如何遍历二维数组,计算每行元素的算术平均值,并将结果依次存储到新的一维double数组中,涵盖传统循环和stream api两种实现方式。
本文介绍如何遍历二维数组,计算每行元素的算术平均值,并将结果依次存储到新的一维double数组中,涵盖传统循环和stream api两种实现方式。
在处理学生成绩等二维数据时,常需将每行(代表一名学生)的成绩求平均,生成对应的GPA数组。核心在于:计算完某一行的平均值后,必须显式赋值给目标数组对应索引位置——这正是原代码缺失的关键一步。
✅ 修正后的传统循环写法
double[][] grades = {
{ 3.83, 9.21, 9.25, 0.84, 1.40, 7.90, 1.41, 5.15 },
{ 5.09, 3.66, 3.04, 3.02, 8.59, 2.34, 8.86, 7.40 },
{ 5.35, 0.85, 8.56, 7.37, 2.78, 3.19, 2.04, 5.70 },
{ 9.25, 9.62, 7.08, 7.27, 9.86, 5.88, 9.86, 9.70 },
{ 3.39, 2.75, 1.23, 1.04, 3.87, 8.72, 4.60, 6.21 }
};
// 创建长度匹配学生数量的新数组
double[] gpa = new double[grades.length];
for (int i = 0; i < grades.length; i++) {
double sum = 0.0;
for (int j = 0; j < grades[i].length; j++) {
sum += grades[i][j];
}
double avg = sum / grades[i].length;
gpa[i] = avg; // ✅ 关键:将第i行平均值存入gpa[i]
}
// 输出验证
System.out.printf("GPAs: [%.2f, %.2f, %.2f, %.2f, %.2f]%n",
gpa[0], gpa[1], gpa[2], gpa[3], gpa[4]);
// 输出:GPAs: [4.87, 5.25, 4.48, 8.57, 3.98]⚠️ 注意事项:
- gpa[i] = avg; 必须放在内层循环结束后、外层循环继续前;否则会导致覆盖错误或未赋值(默认为 0.0)。
- 建议初始化 sum 为 0.0(而非 0),避免隐式类型转换歧义;
- 若某行为空(grades[i].length == 0),需额外判断防止除零异常。
✨ 更简洁的 Stream API 写法(Java 8+)
利用函数式编程可大幅精简逻辑,提高可读性:
import java.util.Arrays;
double[] gpa = Arrays.stream(grades)
.mapToDouble(row -> Arrays.stream(row)
.average()
.orElse(0.0)) // 处理空行(可选)
.toArray();该写法:
立即学习“Java免费学习笔记(深入)”;
- Arrays.stream(grades) 将二维数组转为 Stream<double[]>;
- .mapToDouble(...) 对每一行调用 Arrays.stream(row).average() 计算均值(返回 OptionalDouble);
- .orElse(0.0) 提供空行兜底值(生产环境建议根据业务逻辑处理);
- .toArray() 最终生成 double[]。
总结
无论采用传统循环还是Stream API,核心逻辑一致:逐行聚合 → 计算均值 → 显式赋值到目标数组对应下标。初学者易忽略赋值语句的位置与时机,导致数组元素全为初始值 0.0。推荐在理解基础循环原理后,逐步过渡到Stream写法——它更安全、更声明式,也更契合现代Java开发实践。


















