You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

访客数量最多的时间区间查找问题及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

代码错误分析

  1. 内层遍历范围错误:内层循环j从1开始,既跳过了索引0的访客数据,又会在i≥1时重复计算当前i对应的访客(自身),导致计数虚高。
  2. 区间变量非法修改:遍历过程中直接修改当前i对应的entranceTime和leavingTime,后续判断基于被修改的区间,导致区间被错误收缩,所有非第一个访客的统计都被合并为同一个区间。
  3. 重叠统计逻辑混乱:将区间交集计算与计数累加混合进行,每遍历一个重叠区间就收缩一次当前区间,最终破坏了原始区间的判断基准。

修正后的代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 04:10:14