Grails-排序列表输出,而不必具有SortedSet或类似模型?

Grails-排序列表输出,而不必具有SortedSet或类似模型?,grails,groovy,Grails,Groovy,我的头撞在墙上,我认为这是一个在Grails中要解决的非常简单的问题: 说我有购物车样的模型;因此,一个类购物车有很多物品,每个物品都属于购物车。一般来说,我不关心购物车中物品的顺序-我不关心它们的存储顺序、计算顺序等。但是,我确实希望以相同的顺序显示它们。在我看来,这种逻辑应该能够完全存在于视图层中,但我能找到的唯一解决方案告诉我在模型层中将项声明为一个SortedSet。这也会影响我的控制器层,因为像.collect{}这样的简单列表操作现在需要额外的语法跳转来保持类型转换的正确性并保留我的

我的头撞在墙上,我认为这是一个在Grails中要解决的非常简单的问题:

说我有购物车样的模型;因此,一个类购物车有很多物品,每个物品都属于购物车。一般来说,我不关心购物车中物品的顺序-我不关心它们的存储顺序、计算顺序等。但是,我确实希望以相同的顺序显示它们。在我看来,这种逻辑应该能够完全存在于视图层中,但我能找到的唯一解决方案告诉我在模型层中将项声明为一个SortedSet。这也会影响我的控制器层,因为像.collect{}这样的简单列表操作现在需要额外的语法跳转来保持类型转换的正确性并保留我的排序

对我来说,这简直是胡说八道,所以我一定错过了一些简单的东西!例如,是否有任何方法可以执行类似于
或类似的操作,以便仅在输出/视图层强制执行一致的显示顺序?编辑-见下面马特的答案;这种方法的一个版本确实有效

谢谢你的建议和指点

看起来它可以满足您的需要。如果没有,您可以随时制作自己的标签。Tag类可以像这样进行排序

class SortTagLib {

    static namespace = 'sort'

    def sort = { attrs ->

        // A closure that does the sorting can be passed as an attribute to the tag.
        // If it is not provided the default sort order is used instead
        def sorter = attrs.sorter ?: {item1, item2 -> item1 <=> item2}
        sorter = sorter as Comparator        

        // The collection to be sorted should be passed into the tag as a parameter
        Collections.sort(attrs.items, sorter)
    }
}
class-SortTagLib{
静态命名空间='sort'
def sort={attrs->
//进行排序的闭包可以作为属性传递给标记。
//如果未提供,则使用默认排序顺序
def sorter=attrs.sorter?:{item1,item2->item1 item2}
分拣机=分拣机作为比较器
//要排序的集合应作为参数传递到标记中
集合.分拣(属性项、分拣机)
}
}
然后,可以使用此标记按对象的名称属性对对象集合进行排序,如下所示:

<sort:sort items="someCollection" sorter="${someComparatorClosure}"/>


执行标记时,
someCollection
引用的集合将被就地排序。

您也可以使用此处定义的集合/映射可用的排序方法:

我个人发现,与GSP中的标签结合使用非常容易:

<!-- Books sorted by title -->
<g:each in="${ books.sort{a,b-> a.title.compareTo(b.title)} }">
    <p>Title: ${it.title}</p>
    <p>Author: ${it.author}</p>
</g:each>

标题:${it.Title}

作者:${it.Author}


要了解更多操作集合和地图的方法,我建议分别使用和。

太好了。我最终在使用ProxyGenerator和Comparator接口的相同路线上偶然发现了一个类似的解决方案,但您的解决方案要干净得多,而且肯定是我一直在寻找的那种解决方案。谢谢谢谢Matt…你的解决方案也很有效,而且也很干净,尽管我可以发誓我之前试过了,但失败了…我的大脑一定是浑浊的。谢谢