как вы можете отсортировать по дате для ArrayList с TreeMap в качестве значения

#java #map #treemap

#java #Карта #treemap

Вопрос:

в моем коде у меня есть ArrayList<TreeMap<String, Object>> . Что TreeMap было бы, так это ключ и значение. существует ключ с именем sent_date со значением в формате yyyy-MM-DD HH:MM:SS . Я не могу найти способ отсортировать этот список…Может кто-нибудь, пожалуйста, помочь? Спасибо.

Комментарии:

1. Как именно вы хотите, чтобы ваш список был отсортирован? Что вы уже пробовали?

2. Вы хотите сказать, что каждый TreeMap элемент содержит только 1 запись? Почему бы просто не использовать a TreeMap и ArrayList полностью отказаться от него, если это так?

3. Будет ли таблица guava лучшей структурой данных? docs.guava-libraries.googlecode.com/git-history/v17.0/javadoc /…

4. TreeMap имеет больше записей, и sent_date является одной из них.

5. когда я попытался перебрать ArrayList и распечатать значения в TreeMap , я хотел бы упорядочить их по sent_date . Я думал, что это можно сделать сразу после того, как все элементы будут добавлены в ArrayList so, поэтому мне не нужно менять свой цикл

Ответ №1:

Вы можете использовать Collections.sort(list, comparator) , где вам нужно реализовать a Comparator<Map<String,?>> , чтобы делать то, что вам нужно (т. Е. извлекать sent_date из двух карт и сравнивать их).

Комментарии:

1. Я также буду 1 любому, кто опубликует краткую реализацию с новыми функциями Java8. Теперь это должно быть возможно без особых шаблонов.

2. компаратор — это та часть, которую я не понимаю… Не могли бы вы привести мне еще один пример?

Ответ №2:

В Java 8 это было бы (для сортировки, которая изменяет список):

 DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
list.sort(Comparator.comparing(m -> LocalDateTime.parse(m.get("sent_date"), format)));
 

Или, если вы хотите сохранить исходный список:

 newList = list.stream()
              .sorted(Comparator.comparing(...))
              .collect(Collectors.toList());
 

Комментарии:

1. хм … у меня java7:(