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

统计符合时间差条件的IP数据序列次数:Java代码问题排查

问题分析:IP序列统计代码错误排查

问题场景

我有一个文件,每行格式为IPAddress:Timestamp(IP地址采用标准IPv4格式,时间戳为从epoch开始的秒数)。需要统计满足以下条件的序列起始次数:同一IP地址的任意两行之间的时间差< 240秒。

示例数据:

1.2.3.4:0
1.2.3.4:50
1.2.3.4:60
1.2.3.4:70
5.6.7.8:80
1.2.3.4:1500
1.2.3.4:1600

预期结果:2,因为第1-4行构成一个符合条件的序列,第6-7行构成另一个。

用户实现代码

int count = 0;
HashMap<String, Long> t = new HashMap<>();

for (Map.Entry<String, List<Row>> entry : IP_MAP.entrySet()) {
    List<Row> list = entry.getValue();
    t.put(entry.getKey(), 0L);

    for (int i = 0; i < list.size() - 1; i++) {
        long d = list.get(i + 1).getTimestamp() - list.get(i).getTimestamp();
        if (d > 0 && d < FOUR_MINUTES && list.get(i).getTimestamp() - t.get(entry.getKey()) > FOUR_MINUTES) {
            count++;
        }
        t.put(entry.getKey(), list.get(i).getTimestamp());
    }
}

return count;

其中FOUR_MINUTES是值为240的long常量,时间戳为long类型,IP地址为String类型。

代码存在的问题

  1. 初始对比值错误:将t的初始值设为0L,导致第一个序列的起始判断失效。比如示例中1.2.3.4的第一个时间戳是0,list.get(i).getTimestamp() - t.get(entry.getKey())结果为0,不满足> FOUR_MINUTES的条件,无法统计第一个序列。
  2. 序列起始逻辑偏差:当前逻辑试图通过对比当前行与上一次记录的t值来判断新序列,但这个t值会被每一行覆盖,无法准确识别序列的起点。正确的判断应该是:当相邻两行时间差<240,且上一对相邻行不满足该条件(或当前是第一对满足的行)时,才算新序列起始。
  3. 未考虑列表排序:代码默认IP对应的时间戳列表是升序排列的,但如果原数据乱序,时间差计算会完全错误,导致统计结果偏差。

修正后的代码方案

private static final long FOUR_MINUTES = 240L;

public int countValidSequences(Map<String, List<Row>> ipMap) {
    int count = 0;

    for (Map.Entry<String, List<Row>> entry : ipMap.entrySet()) {
        List<Row> rows = entry.getValue();
        // 必须先按时间戳升序排序,确保时间差计算正确
        rows.sort(Comparator.comparingLong(Row::getTimestamp));
        
        boolean inSequence = false;

        for (int i = 1; i < rows.size(); i++) {
            long prevTs = rows.get(i-1).getTimestamp();
            long currTs = rows.get(i).getTimestamp();
            long diff = currTs - prevTs;

            if (diff > 0 && diff < FOUR_MINUTES) {
                if (!inSequence) {
                    // 检测到新序列起始,计数+1
                    count++;
                    inSequence = true;
                }
            } else {
                // 序列中断,重置状态
                inSequence = false;
            }
        }
    }

    return count;
}

关键修正说明

  1. 强制排序:对每个IP的时间戳列表做升序排序,确保相邻行的时间差计算符合逻辑。
  2. 序列状态标记:用inSequence变量跟踪是否处于有效序列中,仅当首次进入有效序列时计数,避免重复统计同一序列的后续行。
  3. 简化判断逻辑:直接通过相邻行的时间差判断序列的起始与中断,逻辑清晰且符合需求定义。

用示例数据测试时,该代码会正确统计出2的结果,符合预期。

内容的提问来源于stack exchange,提问作者Admin_PCNGroup

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 13:50:39