Сортировка 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 шт):
Судя по паттерну, можно привести строки к объекту LocalDateTime. И да, как вы сказали, необходимо отсортировать массив например с помощью Comparator-а
listofcountries.sort(Comparator.comparing(LocalDateTime::parse));
Если необходимо удалить строки из существующего массива, то можно сделать это в цикле (идем с конца, т.к. размер будет меняться после каждого удаления):
for (int i = listofcountries.size() - 2; i > 0; i--) {
listofcountries.remove(i);
}
Могу предложить такой способ:
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));
- Сортируем исходный лист и обрезаем его по краям (по одному элементу)
- Удаляем из исходного листа все элементы, которые одновременно содержатся и в сгенерированном листе.