
本文讲解如何对一个 15×7 的二维数组(每行代表一部电影在 7 个影厅的观影人数),计算每行总和,并准确找出总和最大的那一行(即最热门电影),同时返回其行索引与总和值。
本文讲解如何对一个 15×7 的二维数组(每行代表一部电影在 7 个影厅的观影人数),计算每行总和,并准确找出总和最大的那一行(即最热门电影),同时返回其行索引与总和值。
在实际业务场景中(例如影院票房分析系统),我们常需基于多维度数据聚合后进行极值判定。本例中,Main.attendants[15][7] 存储了 15 部电影(行)在 7 个影厅(列)的观众人数。目标不是找单个单元格最大值(如原答案误用的逐元素比较),而是先按行求和,再在 15 个行和中定位最大值及其行号——这才是“最热电影”的正确统计逻辑。
✅ 正确解法:分两步完成行和计算与极值查找
首先,需为每行计算总和(即该电影在全部影厅的总观影人次),并维护两个变量:
- maxSum:记录当前找到的最大行和;
- bestMovieIndex:记录该最大和对应的电影行号(0-based)。
以下是完整、健壮、可直接集成到 Swing 事件处理器中的实现:
private void PeliculaMasVistaButtonActionPerformed(java.awt.event.ActionEvent evt) {
// 假设 Main.attendants 已正确定义并初始化(int[15][7])
int[] rowSums = new int[15]; // 存储每部电影的总观影人数
int maxSum = Integer.MIN_VALUE;
int bestMovieIndex = -1;
// 第一步:遍历每行,计算行和并存入 rowSums
for (int i = 0; i < 15; i++) {
int sum = 0;
for (int j = 0; j < 7; j++) {
sum += Main.attendants[i][j];
}
rowSums[i] = sum;
// 第二步:边计算边更新最大值与索引(更高效,避免二次遍历)
if (sum > maxSum) {
maxSum = sum;
bestMovieIndex = i;
}
}
// 输出结果(可根据需要替换为 JOptionPane 或界面标签更新)
System.out.println("最热门电影是第 " + (bestMovieIndex + 1) + " 部(索引 " + bestMovieIndex + "),总观影人次:" + maxSum);
}⚠️ 关键注意事项
- 勿混淆“单个元素最大值”与“行和最大值”:原问题答案错误地遍历所有单元格寻找最大值,这只能得出“某场次最高单厅人数”,而非“哪部电影总热度最高”。务必按行聚合后再比较。
- 边界安全:使用 Integer.MIN_VALUE 初始化 maxSum,确保能正确处理全负数(虽本场景不适用,但属良好实践);初始化 bestMovieIndex = -1 可辅助调试异常空数组。
- 可扩展性建议:若矩阵尺寸可能变化,应避免硬编码 15 和 7,改用 Main.attendants.length 和 Main.attendants[0].length 动态获取。
- 性能优化:上述代码在一次双重循环中同步完成求和与极值判断,时间复杂度 O(15×7) = O(1),无需额外遍历 rowSums 数组。
✅ 总结
识别“最热门电影”的本质是行聚合 + 一维数组极值索引查找。核心在于:
① 对每行执行 sum = Σ(attendants[i][j]);
② 在累加过程中实时追踪最大和及其行下标;
③ 最终结果即为 bestMovieIndex(电影序号)与 maxSum(总人次)。
此方法逻辑清晰、无冗余计算、易于验证与维护,是处理此类矩阵行级统计任务的标准范式。










