Java实现:行长度不同的二维数组每行剔除最值后求平均值
处理变长二维数组:剔除最值后计算每行平均值的Java实现
嘿,我帮你梳理并完善这个需求的Java实现,顺便修正你现有代码里的几个小问题~
先说说现有代码的问题
你当前用了固定大小的二维数组int[10][12],但需求是处理行长度不同的数据,这样很容易出现数组越界或者数据丢失的情况。另外空的catch块会掩盖错误,不利于调试,最好加上异常打印。咱们用动态集合来解决这些问题会更合适。
完整实现代码
下面是适配变长行、逻辑完整的代码:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.OptionalDouble; public class RowAverageCalculator { // 读取文件数据,返回动态二维列表(适配每行长度不同) private static List<List<Integer>> readDataFromFile(String filePath) { List<List<Integer>> data = new ArrayList<>(); // 用try-with-resources自动关闭流,避免资源泄漏 try (BufferedReader in = new BufferedReader(new FileReader(filePath))) { String line; while ((line = in.readLine()) != null) { // 跳过空行,避免无效数据 if (line.trim().isEmpty()) { continue; } String[] values = line.split("\\s+"); List<Integer> row = new ArrayList<>(); for (String str : values) { try { int num = Integer.parseInt(str); row.add(num); } catch (NumberFormatException e) { // 跳过非数字的无效内容 System.out.println("忽略无效数据:" + str); } } data.add(row); } } catch (IOException e) { // 打印异常信息,方便排查问题 e.printStackTrace(); } return data; } // 计算单行剔除最小、最大值后的平均值 private static OptionalDouble calculateAverageWithoutMinMax(List<Integer> row) { // 处理边界情况:行长度≤2时,剔除最值后没有足够元素计算平均 if (row.size() <= 2) { System.out.println("行数据长度不足,无法计算剔除最值后的平均值"); return OptionalDouble.empty(); } int min = Integer.MAX_VALUE; int max = Integer.MIN_VALUE; int sum = 0; // 一次遍历同时拿到总和、最小值、最大值,效率更高 for (int num : row) { sum += num; if (num < min) { min = num; } if (num > max) { max = num; } } // 调整总和并计算平均 int adjustedSum = sum - min - max; int validCount = row.size() - 2; return OptionalDouble.of((double) adjustedSum / validCount); } public static void main(String[] args) { String filePath = "StudentIdAverage.txt"; List<List<Integer>> data = readDataFromFile(filePath); // 遍历每行计算并输出结果 for (int i = 0; i < data.size(); i++) { List<Integer> row = data.get(i); OptionalDouble average = calculateAverageWithoutMinMax(row); // 只有能计算出平均值时才输出 average.ifPresent(avg -> System.out.printf("第%d行的平均值(剔除最值后):%.2f%n", i+1, avg)); } } }
代码关键点说明
- 动态存储:用
List<List<Integer>>替代固定数组,完美适配每行长度不同的场景,不用预先指定行列数。 - 健壮性优化:自动跳过空行和非数字的无效数据,异常信息打印帮助调试,try-with-resources自动管理IO资源。
- 高效计算:一次遍历同时获取总和、最小值、最大值,比多次遍历更高效。
- 边界处理:用
OptionalDouble处理无法计算平均值的情况(比如行太短),避免返回错误值或空指针。
测试示例
假设你的StudentIdAverage.txt内容如下:
85 92 78 90 60 75 95 88 72 80 91
运行代码后会输出:
第1行的平均值(剔除最值后):88.00 行数据长度不足,无法计算剔除最值后的平均值 第3行的平均值(剔除最值后):86.33
内容的提问来源于stack exchange,提问作者john john
相关产品推荐
相关产品推荐

