2015-07-10 75 views
1

的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

这个问题与纯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)}

+0

问题是如何让这个'mapComparator = new Comparator(...)'进入模板?在哪里定义它以及如何从模板中访问此自定义代码......? – haui

+1

您需要将mapComparator作为属性添加到控制器中的模型中:model.addAttribute(“mapComparator”,mapComparator);那么在你的模板中你可以使用:$ {#lists.sort(yourlist,mapComparator)} –

+0

这很好,如果你有权访问模板**和模板引擎。当使用模板例如为了用JBake生成静态站点,这不是一个选项,因为还必须修改页面生成器。当我能够修改模板后面的模型时,我还可以添加提供整个排序方法的对象。我的这个'#lists.sort()'函数的存在在这种情况下意义不大。我正在寻找的是一种在模板本身内定义比较的机制。 – haui

相关问题