gpt4 book ai didi

grails - 在Grails中排序列表或getAll

转载 作者:行者123 更新时间:2023-12-02 14:56:53 27 4
gpt4 key购买 nike

我想在域类中实现默认的排序顺序,并立即发现它不适用于getAll方法。没关系,我只是使用list而已。事实是,域类中的默认排序顺序不允许您指定多个排序字段(as seen here)。

我的目标是首先按其Foo对象的名称对所有Bar对象进行排序,然后再按其自己的名称进行排序。

class Foo {
String name
String Bar
}

class Bar {
String name
}

如何在域类中实现此功能,因此不必每次调用 .list()时都指定一个冗长/讨厌的比较器?

我的尝试之一:
static Comparator getComparator() { 
def c = { a, b ->
def result = a.bar.name.compareTo( b.bar.name );
if ( result == 0 ) {
result = a.name.compareTo( b.name );
}
}
return c as Comparator
}

然后,我可以叫 Foo.list(Foo.getComparator()) ...如果可以使它工作。

更新:

我想我真的很接近这里,只是在同一排序封闭中实现两个比较时遇到麻烦。
Foo.list().sort{ a, b ->
def result = a.bar.name <=> b.bar.name;
// Things mess up when I put this if statement in.
if( result == 0 ) {
a.name <=> b.name
}
}

迪斯科!
class Foo { // My domain class
// ...

static Comparator getComparator() {
def c =[
compare: { a, b ->
def result = a.bar.name <=> b.bar.name;
if( result == 0 ) {
result = a.name <=> b.name
}
return result
}
] as Comparator
}

// ...
}

并在我的 Controller 中这样实现:
Foo.list().sort( Foo.getComparator() )

PS:

上面的方法可以工作,但是我讲解后,Jeff Storey在他的答案中发布了一些代码,他的代码可以工作并且比我的代码好得多,所以请使用它:)

最佳答案

在您的情况下,让Foo实现Comparable是否有意义,并且该实现可以按照您的描述进行比较?然后,当您对列表中的对象进行排序时,由于它们是Comparable,它们将正确排序。

如果实现Comparable对您来说没有意义,则需要指定一个比较器作为排序依据。

以下是根据您的评论提供的一些示例代码:

编辑:

class Person implements Comparable<Person> {

String firstName
String lastName

int compareTo(Person other) {
int lastNameCompare = lastName <=> other.lastName
return lastNameCompare != 0 ? lastNameCompare : firstName <=> other.firstName
}

String toString() {
"${lastName},${firstName}"
}
}

def people = [new Person(firstName:"John",lastName:"Smith"), new Person(firstName:"Bill",lastName:"Jones"), new Person(firstName:"Adam",lastName:"Smith")]
println "unsorted = ${people}"
println "sorted = ${people.sort()}"

打印:
unsorted = [Smith,John, Jones,Bill, Smith,Adam]
sorted = [Jones,Bill, Smith,Adam, Smith,John]

关于grails - 在Grails中排序列表或getAll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11199956/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com