Я читаю logfile в java. Для каждой строки в файле журнала я проверяю, содержит ли строка ip-адрес. Если строка содержит IP-адрес, я хочу, чтобы затем +1 к числу количества раз, которое ip-адрес появился в файле журнала. Как я могу выполнить это на Java?подсчет уникальных вхождений строки в документе
Код ниже успешно извлекает ip-адрес из каждой строки, содержащей IP-адрес, но процесс подсчета входов ip-адресов не работает.
void read(String fileName) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fileName)));
int counter = 0;
ArrayList<IPHolder> ips = new ArrayList<IPHolder>();
try {
String line;
while ((line = br.readLine()) != null) {
if(!getIP(line).equals("0.0.0.0")){
if(ips.size()==0){
IPHolder newIP = new IPHolder();
newIP.setIp(getIP(line));
newIP.setCount(0);
ips.add(newIP);
}
for(int j=0;j<ips.size();j++){
if(ips.get(j).getIp().equals(getIP(line))){
ips.get(j).setCount(ips.get(j).getCount()+1);
}else{
IPHolder newIP = new IPHolder();
newIP.setIp(getIP(line));
newIP.setCount(0);
ips.add(newIP);
}
}
if(counter % 1000 == 0){System.out.println(counter+", "+ips.size());}
counter+=1;
}
}
} finally {br.close();}
for(int k=0;k<ips.size();k++){
System.out.println("ip, count: "+ips.get(k).getIp()+" , "+ips.get(k).getCount());
}
}
public String getIP(String ipString){//extracts an ip from a string if the string contains an ip
String IPADDRESS_PATTERN =
"(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)";
Pattern pattern = Pattern.compile(IPADDRESS_PATTERN);
Matcher matcher = pattern.matcher(ipString);
if (matcher.find()) {
return matcher.group();
}
else{
return "0.0.0.0";
}
}
Класс держатель:
public class IPHolder {
private String ip;
private int count;
public String getIp(){return ip;}
public void setIp(String i){ip=i;}
public int getCount(){return count;}
public void setCount(int ct){count=ct;}
}
A [ 'Map'] (https://docs.oracle.com/javase/7/docs/api/java/util/Map.html), вероятно, что вам нужно (ключ = IP, значение = count). Гуава ['Multiset'] (https://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained#Multiset) - необычная альтернатива –
@RC. как бы выглядел код с картой? – CodeMed
Ссылка на 'Multiset' имеет пример карты –