我有一个文件行的形式为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地址存储为String
,FOUR_MINUTES
是等于240
的long。(240秒= 4分钟)。
问题是我的成绩总是太低。
我的代码中可能有什么问题?谢谢
1条答案
按热度按时间oxalkeyp1#
entry.getKey()返回什么?您似乎忽略了一个事实,即同一IP可以有不同的序列。举个例子,对于IP www.example.com有两个序列1.2.3.4,但是在代码中,如果getKey返回相同的值,那么您将只将其计为一个序列。