统计符合时间差条件的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类型。
代码存在的问题
- 初始对比值错误:将
t的初始值设为0L,导致第一个序列的起始判断失效。比如示例中1.2.3.4的第一个时间戳是0,list.get(i).getTimestamp() - t.get(entry.getKey())结果为0,不满足> FOUR_MINUTES的条件,无法统计第一个序列。 - 序列起始逻辑偏差:当前逻辑试图通过对比当前行与上一次记录的
t值来判断新序列,但这个t值会被每一行覆盖,无法准确识别序列的起点。正确的判断应该是:当相邻两行时间差<240,且上一对相邻行不满足该条件(或当前是第一对满足的行)时,才算新序列起始。 - 未考虑列表排序:代码默认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; }
关键修正说明
- 强制排序:对每个IP的时间戳列表做升序排序,确保相邻行的时间差计算符合逻辑。
- 序列状态标记:用
inSequence变量跟踪是否处于有效序列中,仅当首次进入有效序列时计数,避免重复统计同一序列的后续行。 - 简化判断逻辑:直接通过相邻行的时间差判断序列的起始与中断,逻辑清晰且符合需求定义。
用示例数据测试时,该代码会正确统计出2的结果,符合预期。
内容的提问来源于stack exchange,提问作者Admin_PCNGroup
相关产品推荐
相关产品推荐

