Как отсортировать значения шаблона FreeMarker HashMap

У меня есть в java этот HashMap:

HashMap<String, String> map = new HashMap<String, String>();

     map.put("k1",  "3");
     map.put("k2", "4");
     map.put("k3", "2");
     map.put("k4", "6");
     map.put("k5", "1");
     map.put("k6", "5");

Я печатаю шаблоном freemarker в таком режиме:

<#list map?values as v>
${v} - 
</#list>

но печатает в таком порядке:

2 - 6 - 1 - 5 - 3 - 4

Я хотел бы напечатать в этом порядке:

1 - 2 - 3 - 4 - 5  -6

как я могу сортировать значения с помощью шаблона freemarker?


person ersecchio    schedule 08.05.2011    source источник


Ответы (5)


Попробуй это:

<#list map?values?sort as v>
    ${v} - 
</#list>

Обратите внимание на использование встроенной функции sort для последовательности значений.

person Laurent Pireyn    schedule 09.05.2011

Если вы отображаете значения независимо от ключей, вы можете взять значения из карты и построить из них TreeSet. Тогда значения будут в порядке.

TreeSet ordered =  new TreeSet(map.values());

затем

 <#list ordered as v>
     ${v} - 
 </#list>
person Vincent Ramdhanie    schedule 08.05.2011
comment
Если вы можете добавить отсортированные значения в модель, то это правильный ответ. - person Laurent Pireyn; 09.05.2011

Такое поведение предсказуемо, поскольку HashMaps не упорядочены. Как было указано в комментариях, SortedMap, например. TreeMap будет сортировать по ключам. Так что вам придется вырезать некоторый код, чтобы отсортировать это.

См. Сортировка карты‹Key, Value› по значения (Java)

person planetjones    schedule 08.05.2011

HashMap не упорядочен. Вместо этого вы должны использовать TreeMap, который реализует a SortedMap: -

SortedMap<String, String> map = new TreeMap<String, String>();

Обратите внимание - Sorted Map provides a total ordering on its keys. Вы не можете отсортировать его по значениям. Если вы хотите отсортировать значения, вы всегда можете сделать это, отсортировав по Map.entrySet() с использованием Сопоставимо .

Также взгляните на этот очень похожий вопрос: TreeMap sort by value

person CoolBeans    schedule 08.05.2011
comment
TreeMap не поддерживается SortedMap, он реализует его </nit-pick> - person skaffman; 08.05.2011
comment
-1: SortedMap отсортированы по ключам, а не по значениям. Это не то, что спрашивают. - person Laurent Pireyn; 09.05.2011
comment
@Laurent Pireyn - Не забудьте прочитать полный ответ. Я четко упомянул, что он сортируется по ключам, и привел пример, как сортировать по значениям! Пожалуйста, прочитайте ответы полностью, прежде чем голосовать против. - person CoolBeans; 09.05.2011
comment
@CoolBeans: я прочитал полный ответ, но все же думаю, что он не отвечает на вопрос. Вы говорите о отсортированных картах, но затем признаете, что это не то, чего хочет ОП, и перенаправляете его на связанный с этим вопрос. Действительный ответ должен содержать полное решение вопроса или, по крайней мере, краткое изложение такого решения со ссылками на полную версию. - person Laurent Pireyn; 09.05.2011
comment
@Laurent Pireyn - это упоминается в ответе, как решить эту проблему с помощью Map.entrySet() и Comparable. Вот почему я сказал прочитать полный ответ! - person CoolBeans; 09.05.2011

Если вам нужна итерация по HashMap в предсказуемом порядке, вы можете использовать LinkedHashMap с предсказуемым порядком итераций, он поддерживает двусвязный список, проходящий через все его записи.

person rsp    schedule 08.05.2011
comment
@Laurent, есть несколько способов добиться результата, хэш-карта, которая воспроизводит порядок вставки, может быть очень полезна, когда вам нужно контролировать расширение шаблона. Порядок сортировки подходит только для нетривиальных ситуаций. - person rsp; 09.05.2011
comment
Карта, сохраняющая порядок вставки, действительно может быть полезной, но здесь все же не об этом. ОП спрашивает, как сортировать значения карты, а не как сохранить порядок их вставки. - person Laurent Pireyn; 09.05.2011