Как отсортировать ключи HashMap - PullRequest
11 голосов
/ 28 января 2012

У меня есть одна проблема

HashMap<String, List<AppPrjMilestone>> dateMilestoneMap
                                 = new HashMap<String, List<AppPrjMilestone>>();

Я помещаю динамический ключ в объект Hashmap следующим образом:

dateMilestoneMap.put(""+crateDate,value);

Наконец, я получаю такой результат:

("28/01/2012",value)
("01/01/2012",value)
("26/01/2012",value)

Я хочу вернуть пары ключ-значение в порядке desc или asc.Как я могу это сделать?

Ответы [ 5 ]

24 голосов
/ 28 января 2012

HashMaps не хранит отсортированный порядок ключей по определению.Однако вы можете сделать это, получив массив ключей с помощью: Object[] keys = map.keySet().toArray(); Затем отсортировав список с массивами: Arrays.sort(keys); и, наконец, перебирая каждый ключ и извлекая значение из HashMap.

for(Object key : keys) { System.out.println(map.get(key)); }

Шаг сортировки здесь заставит алгоритм работать в O (n lg n), а не в O (n), что было бы возможно при использовании структуры данных сортировки.

Это отсортирует список лексикографически,Поскольку в вашем вопросе используется общий формат даты в США, список будет отсортирован по дням, месяцам и годам.Это вряд ли правильно.Вы можете использовать год, месяц, формат строки даты дня или выбрать более подходящий ключевой объект.DateTime и DateTimeComparator Joda-Time были бы весьма полезны.Просто используйте DateTime в качестве ключа и экземпляр DateTimeComparator при вызове Arrays.sort(keys, comparator);.

4 голосов
/ 28 января 2012

Ключи карты хранятся в Set, который не может быть отсортирован.Вы можете сделать это, добавив ключи набора карт в List и отсортировав его вместо этого.

например

List<Date> sortedKeys = new ArrayList<Date>(dateMilestoneMap.size());
sortedKeys.addAll(dateMilestoneMap.keySet());
Collections.sort(sortedKeys); //sorts in ascending date order 
                             //(pass in custom Comparator to sort differently)..

Здесь я использовал Date класс, который намного лучше для хранения дат, чем обычные строки.

2 голосов
/ 28 января 2012

HashMap не обеспечивает порядок при выполнении итерации (или даже гарантирует, что порядок останется прежним, если вы повторяете цикл несколько раз).Если вы хотите естественный порядок клавиш, попробуйте TreeMap.Обратите внимание, что ваши строки отформатированы dd/mm/yy, поэтому, когда TreeMap их упорядочит, они будут сначала возрастать по дням, а не по годам, что, вероятно, не то, что вам нужно.Вы должны либо использовать строки типа yy/mm/dd, переключиться на использование класса, который лучше инкапсулирует эту информацию, например Date, либо определить свой собственный Comparator при создании TreeMap, который знает, как сортировать строки dd/mm/yy вправильный порядок

2 голосов
/ 28 января 2012

HashMap не определяет порядок итерации по элементам. Если вы хотите получить элементы, отсортированные по ключу, используйте взамен TreeMap . Однако, поскольку вы храните строки в формате «ДД / ММ / ГГГГ», порядок, скорее всего, будет не тем, который вам нужен, поэтому либо используйте дату в качестве ключа, либо, по крайней мере, строку вида, например «ГГГГ-ММ-ДД» ».

0 голосов
/ 28 января 2012

Я бы посоветовал вам изменить ключ HashMap со String на Date, например, HashMap<Date, List<AppPrjMilestone>>. Это должно сработать.

упс - сделайте это TreeMap<Date, List<AppPrjMilestone>>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...