Логика следующая:
по каждой строке из лога создается экземпляр Entry:
class Entry{
public String ip;
public String user;
public Date date;
public String event;
public String task;
public String status;
public Entry(String line) {
String[] tmp = line.split("\t");
this.ip = tmp[0];
this.user = tmp[1];
try {
this.date = formatter.parse(tmp[2]);
}catch (ParseException ignored){}
this.event = tmp[3].split(" ")[0];
this.task = tmp[3].split(" ")[1];
this.status = tmp[4];
}
}
По которому с помощью стримов и рефлекции уже отсеиваем данные в соответствие с query:
HashSet<Object> result = new HashSet<>();
result.addAll(lines.stream()
.map(l -> new Entry(l))
.filter(e -> {
try {
Field f = e.getClass().getDeclaredField(queryArr[3]);
if(queryArr[3].equals("date")) return (formatter.parse(queryValue).compareTo((Date) f.get(e)) == 0);
return f.get(e).equals(queryValue);
}catch (Exception ignored){}
return false;
})
.map(p -> {
try {
Field f = p.getClass().getDeclaredField(queryArr[1]);
return f.get(p);
}catch (Exception ignored){}
return null;
})
.collect(Collectors.toSet()));
return result;
Решение рабочее, но валидтор ругается на все пункты с рекомендацией от менторов для п2:
Метод execute неправильно формирует множество IP адресов.
Не могу понять в чем причина, помогите плиз.package com.javarush.task.task39.task3913;
import java.nio.file.Paths;
import java.util.Date;
import java.util.Set;
public class Solution {
public static void main(String[] args) {
//LogParser logParser = new LogParser(Paths.get("c:/logs/"));
LogParser logParser = new LogParser(Paths.get("/tmp/logs/"));
//System.out.println(logParser.getNumberOfUniqueIPs(null, new Date()));
//System.out.println(logParser.getNumberOfUniqueIPs(null, null));
//System.out.println(logParser.getIPsForEvent(Event.DONE_TASK, null, null));
//System.out.println(logParser.execute("get ip for date = \"05.01.2021 20:21:55\""));
//System.out.println(logParser.execute("get user"));
Set set = logParser.execute("get ip for user = \"Amigo\"");
set.forEach(System.out::println);
System.out.println("1");
set = logParser.execute("get ip for user = \"Eduard Petrovich Morozko\"");
set.forEach(System.out::println);
}
}