0

ドメインクラスにデフォルトの並べ替え順序を実装したかったのですが、すぐにgetAllメソッドで機能しないことがわかりました。大したことではありません、私はlist代わりに使用しました。重要なのは、ドメインクラスのデフォルトの並べ替え順序では、複数の並べ替えフィールドを指定できないことです(ここを参照)。

私の目標は、Foo最初にすべてのオブジェクトをオブジェクトの名前で並べ替えBar、次に自分の名前で並べ替えることです。

class Foo {
    String name
    String Bar
}

class Bar {
    String name
}

これをドメインクラスに実装して、呼び出すたびに長い/厄介なコンパレータを指定する必要がないようにするにはどうすればよい.list()ですか?

私の試みの1つ:

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())...私がそれを動かすことができれば。

アップデート:

同じ種類のクロージャで2つの比較を実装するのに問題があるだけで、私はここに本当に近いと思います。

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
    }

    // ...
}

そして、私のコントローラーに次のように実装しました。

Foo.list().sort( Foo.getComparator() )

PS:

上記は機能しますが、私がディスコした後、Jeff Storeyが彼の回答にいくつかのコードを投稿しました。彼のコードは機能し、私のコードよりもはるかに優れているので、それを使用してください:)

4

2 に答える 2

4

あなたの場合、実装することは理にかなっており、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]
于 2012-06-26T02:30:30.100 に答える
2

上記の投稿をさらに単純化するために(コメントしたはずですが、まだ担当者がいません)、エルビス演算子を使用してGroovy比較演算子をチェーンできます。

class Person implements Comparable<Person> {

    String firstName
    String lastName

    int compareTo(Person other) {
        return lastName <=> other.lastName ?: 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()}"

groovyの目には0が偽と見なされるため、これによって同じ結果が得られます。これにより、チェーン内の次の条件が表示されます。

于 2013-09-09T13:58:02.577 に答える