如何用Java编写程序以从文本文件中查找唯一IP地址列表?
我只是Java的新手。我有以下txt格式的数据:
Date first seen Duration Proto Source IP Addr:Port Destination IP Addr:Port Packets Bytes Flows
2013-03-03 23:54:46.574 8.000 UDP 108.169.77.76:12345 -> 108.169.0.112:53 5 325 1
2013-03-03 23:59:51.984 0.000 UDP 100.253.69.196:62458 -> 100.256.234.129:1947 1 68 1
2013-03-03 23:59:52.048 0.000 UDP 108.450.45.35:123124 -> 108.123.0.987:9101 2 1686 1
请注意,我刚刚编写了这些IP地址,实际数据集要大得多。
我想知道如何在java中编写程序以查找唯一的源/目标IP地址列表?还要计算文本文件中每个IP地址的出现次数作为源/目标地址?
答案 0 :(得分:4)
这就是Set系列的用途。创建一个包含一行所有数据的类,实现其equals
和hashcode
方法,使其只关心源和目标,然后只需将所有类添加到Set中,即可最终会有独特的结果。
答案 1 :(得分:0)
如果您有很多IP,我建议您将它们转换为long:
public long ipConversion(String addr){
String[] addrArray = addr.split("\\.");
long num = 0;
for (int i = 0; i < addrArray.length; i++) {
int power = 3 - i;
num += ((Integer.parseInt(addrArray[i]) % 256 * Math.pow(256, power)));
}
return num;
}
然后,您可以将唯一的值添加到arrayList中,该列表用于n
元素O(n*log_n)
ArrayList<Long> arr = new ArrayList<>();
int x = Collections.binarySearch(arr, IPaddress);
if(x < 0)//this mean IPaddress doesnt exist in your list
arr.add(-x-1, IPaddress)
//binary search return -insertionpoint if the element was in the arraylist
//so you should insert it to -insertionpoint-1.
然后将唯一的ips转换为IP地址格式。
或者,cou可以覆盖比较两个IP的类似接口,您可以使用它进行二进制搜索。所以你不必进行转换,这会更快。