Логика следующая:
по каждой строке из лога создается экземпляр 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;
public enum Event {
LOGIN,
DOWNLOAD_PLUGIN,
WRITE_MESSAGE,
SOLVE_TASK,
DONE_TASK
}