Перевод строки в дату (да, я умею пользоваться поиском), JAVA
Есть список мероприятий все они на главной странице.
Есть 1 css селектор, он возвращает (List<WebElements>) "название мероприятия","25 сентября"(дата мероприятия) будем считать текущего года, 2 css селектор (List<WebElements>) возвращает строку "название мероприятия", "С 25 сентября + "еще какой-то левый текст", любой из них может вернуть, например, "Ждите, очень скоро".
Вопрос, нужно найти первое мероприятие и последнее, и не учитывать "Ждите, очень скоро"
Реализация - нужно все полученные мероприятия впихнуть в массив сортировка по дате
Ответы (1 шт):
В целом для начала нужно сконфигурировать парсер даты, а потом с использованием компараторов найти большее и меньшее значение. Дальше дорабатывайте решение под свою конкретную задачу, потому как исходя из описания сделать что-то более конкретное невозможно
@Data
class WebElements {
private final String eventName;
private final String date;
private final String comment;
private final LocalDate parseDate;
public WebElements(String eventName, String date, String comment) {
this.eventName = eventName;
this.date = date;
this.comment = comment;
this.parseDate = parseDateWithDefaultYear(date, LocalDate.now().getYear());
}
private static LocalDate parseDateWithDefaultYear(String stringWithoutYear, int defaultYear) {
try {
DateTimeFormatter parseFormatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("dd MMMM")
.parseDefaulting(ChronoField.YEAR, defaultYear)
.toFormatter(new Locale("ru"));
return LocalDate.parse(stringWithoutYear, parseFormatter);
} catch (DateTimeParseException e) {
return null;
}
}
}
public static void main(String[] args) throws Exception {
List<WebElements> webElements = new ArrayList<>();
webElements.add(new WebElements("хз1", "20 сентября", "комментарий 1"));
webElements.add(new WebElements("хз2", "Ждите, очень скоро", "комментарий 2"));
webElements.add(new WebElements("хз3", "23 сентября", "комментарий 3"));
webElements.add(new WebElements("хз4", "20 апреля", "комментарий 4"));
webElements.add(new WebElements("хз5", "25 декабря", "комментарий 5"));
webElements.add(new WebElements("хз6", "Ждите, скоро", "комментарий 6"));
Optional<WebElements> max = webElements.stream().max((e1, e2) -> {
if (e1.getParseDate() == null && e2.getParseDate() == null) return 0;
if (e1.getParseDate() == null) return -1;
if (e2.getParseDate() == null) return 1;
return e1.getParseDate().compareTo(e2.getParseDate());
});
Optional<WebElements> min = webElements.stream().min((e1, e2) -> {
if (e1.getParseDate() == null && e2.getParseDate() == null) return 0;
if (e1.getParseDate() == null) return 1;
if (e2.getParseDate() == null) return -1;
return e1.getParseDate().compareTo(e2.getParseDate());
});
System.out.println(min);
System.out.println(max);
}