从文本文件中查找唯一IP地址列表

时间:2013-05-16 00:39:34

标签: java regex parsing text

如何用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地址的出现次数作为源/目标地址?

2 个答案:

答案 0 :(得分:4)

这就是Set系列的用途。创建一个包含一行所有数据的类,实现其equalshashcode方法,使其只关心源和目标,然后只需将所有类添加到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的类似接口,您可以使用它进行二进制搜索。所以你不必进行转换,这会更快。