
本文介绍如何遍历二维数组,计算每行元素的算术平均值,并将结果依次存储到新的一维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 <blockquote>
<p>⚠️ 注意事项: </p>
<ul>
<li>gpa[i] = avg; 必须放在内层循环结束后、外层循环继续前;否则会导致覆盖错误或未赋值(默认为 0.0)。 </li>
<li>建议初始化 sum 为 0.0(而非 0),避免隐式类型转换歧义; </li>
<li>若某行为空(grades[i].length == 0),需额外判断防止除零异常。</li>
</ul>
</blockquote><h3>✨ 更简洁的 Stream API 写法(Java 8+)</h3><p>利用函数式编程可大幅精简逻辑,提高可读性:</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review"><img
src="https://img.php.cn/upload/skill/000/000/081/179084711841712.jpg" alt="Java Maven Code Review" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review" class="overflowclass">Java Maven Code Review</a>
<p class="overflowclass">审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。</p>
</div>
<a rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><pre class="brush:php;toolbar:false;">import java.util.Arrays;
double[] gpa = Arrays.stream(grades)
.mapToDouble(row -> Arrays.stream(row)
.average()
.orElse(0.0)) // 处理空行(可选)
.toArray();该写法:
- Arrays.stream(grades) 将二维数组转为 Stream
; - .mapToDouble(...) 对每一行调用 Arrays.stream(row).average() 计算均值(返回 OptionalDouble);
- .orElse(0.0) 提供空行兜底值(生产环境建议根据业务逻辑处理);
- .toArray() 最终生成 double[]。
总结
无论采用传统循环还是Stream API,核心逻辑一致:逐行聚合 → 计算均值 → 显式赋值到目标数组对应下标。初学者易忽略赋值语句的位置与时机,导致数组元素全为初始值 0.0。推荐在理解基础循环原理后,逐步过渡到Stream写法——它更安全、更声明式,也更契合现代Java开发实践。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










