Перевод строки в дату (да, я умею пользоваться поиском), 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);
        
    }
→ Ссылка