使用自定义比较器对Thymeleaf模板中的列表进行排序

时间:2015-07-10 21:25:50

标签: java thymeleaf jbake

Thymeleaf文档说明了排序列表:

/*
 * Sort a copy of the given list. The members of the list must implement
 * comparable or you must define a comparator.
 */
${#lists.sort(list)}
${#lists.sort(list, comparator)}

在我的文档模型中,我有一个带有键值对的映射列表(来自JBake静态页面生成器的published_content列表)。在我的模板中,我想通过比较地图中某个键下存储的值来对此列表进行排序。

换句话说,list变量的类型为List<Map<String, Object>>,我想通过比较密钥"mykey"下存储的每个地图中的值来对此列表进行排序。

如何在模板中制定这样的比较器?

2 个答案:

答案 0 :(得分:3)

问题与纯Java排序问题有关,因为您需要一种方法来对地图列表进行排序,这已经得到了回复here

相关代码:

public Comparator<Map<String, String>> mapComparator = new Comparator<Map<String, String>>() {
    public int compare(Map<String, String> m1, Map<String, String> m2) {
        return m1.get("name").compareTo(m2.get("name"));
    }
}

Collections.sort(list, mapComparator);

使用mapComparator对列表进行排序后,您可以使用Thymeleaf表达式${#lists.sort(list, comparator)},如文档中所述。

答案 1 :(得分:1)

在Thymeleaf中,您需要使用完整的类名(包括包)。像这样:

<span th:each="doc : ${#lists.sort(documents, new com.mycompany.myapp.comparator.DocumentNameComparator())}">
    ...
</span>