java 在给定条件下对数据行的序列进行计数

xmq68pz9  于 2023-05-12  发布在  Java
关注(0)|答案(1)|浏览(172)

我有一个文件行的形式为IPAddress:Timestamp(IP地址是在usuak IPv4符号,时间戳从历元秒).
我想数一下以下事件发生了多少次:它开始一个行序列,使得对于具有相同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,2,3,4行形成这样的序列,第6,7行形成另一个序列。
这就是我所尝试的(使用Java,让Row成为一个汇总文件中一行数据的类):

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;
}

其中时间戳存储为long,IP地址存储为StringFOUR_MINUTES是等于240的long。(240秒= 4分钟)。
问题是我的成绩总是太低。
我的代码中可能有什么问题?谢谢

oxalkeyp

oxalkeyp1#

entry.getKey()返回什么?您似乎忽略了一个事实,即同一IP可以有不同的序列。举个例子,对于IP www.example.com有两个序列1.2.3.4,但是在代码中,如果getKey返回相同的值,那么您将只将其计为一个序列。

相关问题