本文详解如何对一个 15×7 的观众人数矩阵按行求和,并高效定位总观看人数最高的电影(即行和最大值的行索引),提供完整可运行逻辑、常见误区提醒及健壮性优化建议。
本文详解如何对一个 15×7 的观众人数矩阵按行求和,并高效定位总观看人数最高的电影(即行和最大值的行索引),提供完整可运行逻辑、常见误区提醒及健壮性优化建议。
在电影排片分析场景中,你维护了一个 Main.attendants[15][7] 二维数组:15 行代表 15 部电影,7 列代表 7 个放映厅。每项 attendants[i][j] 表示第 i 部电影在第 j 厅的观众人数。要找出“最热门电影”,本质是:计算每部电影(每行)的总观众数(即行和),再从中找出最大行和及其对应的电影索引。
⚠️ 注意:原始代码中虽正确计算了每行和(sumRows),但未保存结果,也未做比较——这是关键缺失。而答案中提供的“查找单个最大元素”逻辑(直接遍历所有单元格)错误地混淆了问题目标:它找的是矩阵中单个最大值(如某厅某场次的峰值人数),而非“哪部电影总观看人次最多”。
✅ 正确解法分两步:
- 逐行累加,存储 15 个行和(推荐使用一维数组或临时变量跟踪最大值);
- 在线比较,记录最大行和及其行号(无需额外存储全部和,节省空间)。
以下是优化后的完整实现:
立即学习“Java免费学习笔记(深入)”;
private void PeliculaMasVistaButtonActionPerformed(java.awt.event.ActionEvent evt) {
// 初始化:假设 Main.attendants 已正确定义并填充
int maxSum = Integer.MIN_VALUE; // 确保能正确处理全负数(虽本场景不适用)
int mostViewedMovieIndex = -1;
for (int i = 0; i < 15; i++) {
int rowSum = 0;
for (int j = 0; j < 7; j++) {
rowSum += Main.attendants[i][j];
}
// 在计算完当前行和后立即比较
if (rowSum > maxSum) {
maxSum = rowSum;
mostViewedMovieIndex = i;
}
}
if (mostViewedMovieIndex != -1) {
System.out.println("最热门电影是第 " + (mostViewedMovieIndex + 1)
+ " 部(索引 " + mostViewedMovieIndex + "),总观众数:" + maxSum);
} else {
System.out.println("警告:未找到有效数据。");
}
}? 关键说明与最佳实践:
- 避免硬编码:将 15 和 7 替换为 Main.attendants.length 和 Main.attendants[0].length,提升可维护性;
- 边界安全:添加空数组/空行检查(如 if (Main.attendants == null || Main.attendants.length == 0));
- 语义清晰:用 mostViewedMovieIndex 比 room/movie 更准确(原答案误将行列含义颠倒);
- 性能友好:单次遍历完成计算与比较,时间复杂度 O(15×7),空间复杂度 O(1);
- 可扩展提示:若需返回多部并列热门电影,可改用 List<Integer> 存储所有满足 rowSum == maxSum 的索引。
通过此方法,你不仅能精准定位最热门电影,还构建了可复用于其他行聚合分析(如最低观影量、平均值)的可靠模式。










