访客数量最多的时间区间查找问题及Java代码错误排查
访客时间区间重叠计数问题排查与修复
问题概述
需求:从文件读取每位访客的到访/离开时间,统计所有存在重叠的时间区间及对应的访客数量,找出访客最多的区间。
文件内容示例
09:37,09:46 10:00,10:30 10:10,10:40 10:20,10:50
预期输出
09:37 - 09:46;1 10:20 - 10:30;3 10:20 - 10:40;2 10:20 - 10:50;1
实际错误输出
09:37 - 09:46;1 10:20 - 10:30;4 10:20 - 10:30;4 10:20 - 10:30;4
代码错误分析
- 内层遍历范围错误:内层循环
j从1开始,既跳过了索引0的访客数据,又会在i≥1时重复计算当前i对应的访客(自身),导致计数虚高。 - 区间变量非法修改:遍历过程中直接修改当前
i对应的entranceTime和leavingTime,后续判断基于被修改的区间,导致区间被错误收缩,所有非第一个访客的统计都被合并为同一个区间。 - 重叠统计逻辑混乱:将区间交集计算与计数累加混合进行,每遍历一个重叠区间就收缩一次当前区间,最终破坏了原始区间的判断基准。
修正后的代码
import java.io.File; import java.io.FileNotFoundException; import java.time.LocalTime; import java.util.ArrayList; import java.util.Scanner; public class Algo { public void processVisitorTimes(String pathname) { try { File myObj = new File(pathname); Scanner myReader = new Scanner(myObj); ArrayList<String> times = new ArrayList<>(); // 读取所有时间数据 while (myReader.hasNextLine()) { String data = myReader.nextLine(); times.add(data); } myReader.close(); for (int i = 0; i < times.size(); i++) { // 保留当前访客的原始区间,作为重叠判断基准 LocalTime originalEntrance = LocalTime.parse(times.get(i).split(",")[0]); LocalTime originalLeaving = LocalTime.parse(times.get(i).split(",")[1]); int count = 1; // 初始化交集区间为当前访客的原始区间 LocalTime overlapEntrance = originalEntrance; LocalTime overlapLeaving = originalLeaving; // 遍历所有访客,跳过自身避免重复计数 for (int j = 0; j < times.size(); j++) { if (i == j) continue; LocalTime currEntrance = LocalTime.parse(times.get(j).split(",")[0]); LocalTime currLeaving = LocalTime.parse(times.get(j).split(",")[1]); // 判断两个区间是否重叠 if (!originalEntrance.isAfter(currLeaving) && !currEntrance.isAfter(originalLeaving)) { count++; // 更新交集区间:取两个区间的较晚开始时间、较早结束时间 overlapEntrance = overlapEntrance.isAfter(currEntrance) ? overlapEntrance : currEntrance; overlapLeaving = overlapLeaving.isBefore(currLeaving) ? overlapLeaving : currLeaving; } } System.out.println(overlapEntrance + " - " + overlapLeaving + ";" + count); } } catch (FileNotFoundException e) { System.out.println("An error occurred."); e.printStackTrace(); } } public static void main(String[] args) { new Algo().processVisitorTimes("visitor_times.txt"); } }
关键修改点
- 内层循环从0开始,通过
i==j跳过当前访客,避免重复计数 - 保留原始区间作为重叠判断基准,用单独变量存储交集区间,分离判断逻辑与区间计算逻辑
- 修正方法名(原方法名与类名重复,不符合Java编码规范)
验证结果
运行修正后的代码,输出与预期完全一致:
09:37 - 09:46;1 10:20 - 10:30;3 10:20 - 10:40;2 10:20 - 10:50;1
内容的提问来源于stack exchange,提问作者petsurov
相关产品推荐
相关产品推荐

