Java游泳圈时统计:数组与平均值的偏差计算及正负标识实现
游泳比赛用时偏差计算功能修复方案
核心修正点
- 修复循环边界错误:原循环终止条件
i < inputArray.length - 1会遗漏最后一个数组元素,需调整为i < inputArray.length,覆盖所有圈数的计算 - 保留偏差正负属性:移除所有
Math.abs()绝对值截断逻辑,直接使用「当前圈时 - 平均圈时」的原始差值存入偏差数组,依托数值本身的正负即可区分快慢:- 圈时 > 平均圈时,差值为正,对应慢于平均的场景
- 圈时 < 平均圈时,差值为负,对应快于平均的场景
- 优化计算效率:原代码在循环判断中多次重复调用
getAverageSplit计算平均值,需在循环开始前一次性计算并缓存平均值,避免无意义的重复计算 - 补充输出格式适配:输出环节根据偏差值的正负,按要求拼接对应的
+/-标识,满足格式要求
修正后的getDeviationsArray方法实现
public static double[] getDeviationsArray(Double[] inputArray) { // 一次性计算缓存平均圈时,避免循环内重复计算 double averageTime = getAverageSplit(inputArray); double[] devArray = new double[inputArray.length]; // 修正循环边界,遍历所有数组元素 for (int i = 0; i < inputArray.length; i++) { // 直接计算原始差值,不做绝对值处理,保留正负属性 devArray[i] = inputArray[i] - averageTime; } return devArray; }
修正后的输出逻辑
原输出环节未根据偏差正负添加指定标识,修正后实现如下:
System.out.println("Here are the split-times and deviations for each lap/length:\n"); double[] devArray1 = getDeviationsArray(lapArray); DecimalFormat df = new DecimalFormat("#.##"); int index1 = 1; for (int i = 0; i < lapArray.length; i++) { double currentDev = devArray1[i]; String devDisplay; // 按规则拼接偏差标识 if (currentDev > 0) { // 慢于平均,添加+标识 devDisplay = "+" + df.format(currentDev); } else if (currentDev < 0) { // 快于平均,DecimalFormat自动输出带-的格式 devDisplay = df.format(currentDev); } else { // 恰好等于平均,无额外标识 devDisplay = "0"; } System.out.println("Lap or length #" + index1 + ": " + lapArray[i] + " seconds (" + devDisplay + ")"); index1++; }
逻辑匹配说明
修正后的输出完全符合需求规则:
- 慢于平均的圈次,偏差值自动带
+号,例如平均圈时30秒、某圈32秒时,输出偏差为+2.00 - 快于平均的圈次,偏差值自动带
-号,例如平均圈时30秒、某圈28秒时,输出偏差为-2.00 - 所有圈次(包括数组最后一个元素)都会被正确计算,不会出现默认0值的遗漏问题
内容的提问来源于stack exchange,提问作者JK3
相关产品推荐
相关产品推荐

