Сортировка LocalDateTime В ArrayList (Java)

Возникла такая проблема. Предположим мне в лист будут попадать следующие даты попадают

public class Sort {

    public static void main(String args[]) {
        ArrayList<String> listofcountries = new ArrayList<String>();
        listofcountries.add("2020-08-14T11:00:00");
        listofcountries.add("2020-08-14T12:00:00");
        listofcountries.add("2020-08-14T13:00:00");
        listofcountries.add("2020-08-14T14:00:00");
        listofcountries.add("2020-08-14T15:00:00");
        listofcountries.add("2020-08-14T16:00:00");
        listofcountries.add("2020-08-14T11:00:00");
        listofcountries.add("2020-08-14T11:00:00");
        listofcountries.add("2020-08-15T07:00:00");
        listofcountries.add("2020-08-15T10:00:00");
        listofcountries.add("2020-08-14T16:00:00");
        listofcountries.add("2020-07-14T12:00:00");
        listofcountries.add("2020-07-14T18:00:00");
        listofcountries.add("2020-07-14T20:00:00");
        listofcountries.add("2020-03-14T11:00:00");

        Collections.sort(listofcountries);

        for (String counter : listofcountries) {
            System.out.println(counter);
        }
    }

}

Но встала проблема. Как мне удалить в этом отрезке все даты кроме первой и последней?

2020-08-14T11:00:00
2020-08-14T12:00:00
2020-08-14T13:00:00
2020-08-14T14:00:00
2020-08-14T15:00:00

Затруднение состоит в том, что я не совсем понимаю, к какому типу данных мне нужно привести объект. Очевидно , что элементы массива нужно сравнить между собой, и скажем если один элемент (Если мы например сравним именно значения дат) Будет больше другого на час, то элемент который больше нужно просто удалить. Но как это сделать я не понимаю. Буду очень признателен за подсказку или совсем в этом вопросе.


Ответы (2 шт):

Автор решения: azlov

Судя по паттерну, можно привести строки к объекту LocalDateTime. И да, как вы сказали, необходимо отсортировать массив например с помощью Comparator

 listofcountries.sort(Comparator.comparing(LocalDateTime::parse));

Если необходимо удалить строки из существующего массива, то можно сделать это в цикле (идем с конца, т.к. размер будет меняться после каждого удаления):

for (int i = listofcountries.size() - 2; i > 0; i--) {
        listofcountries.remove(i);
}
→ Ссылка
Автор решения: Alexey R.

Могу предложить такой способ:

List<String> toRemove = listofcountries.stream().sorted((s1, s2) -> {
    LocalDateTime s1DateTime = LocalDateTime.parse(s1, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"));
    LocalDateTime s2DateTime = LocalDateTime.parse(s2, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"));
    return s1DateTime.compareTo(s2DateTime);
}).limit(listofcountries.size() - 1).skip(1).collect(Collectors.toList());
listofcountries.removeIf(i -> toRemove.contains(i));
  1. Сортируем исходный лист и обрезаем его по краям (по одному элементу)
  2. Удаляем из исходного листа все элементы, которые одновременно содержатся и в сгенерированном листе.
→ Ссылка