32

グレムリンで足を濡らしているところです。グレムリンはグルーヴィーに基づいていることを理解しています。ここでドキュメントを見つけましたが、構文の意味がまだわかりません。

コンパレータを使用したソートの構文がどのように機能するかについて、少し混乱しています。

m.sort{a,b -> a.value <=> b.value}

誰かがとの間のすべての異なるビットが何{}意味するのか説明できますか?

4

2 に答える 2

51

Closureによって使用されるsortパラメータが2つある場合、従来ののように機能しますComparator。つまり、ソート中に行われる2つの要素aとの間の比較ごとに、最初の引数が2番目の引数よりも小さい、等しい、または大きいため、負の整数、ゼロ、または正の整数が返されbます。

特定のシナリオでは、比較は宇宙船オペレーター <=>を使用した結果です。つまり、要素を昇順で効果的に並べ替えています。

たとえば、リストがある場合、[ 3, 2, 1 ]その並べ替えを使用した結果はになります [ 1, 2, 3 ]

したがって、これm.sort{a,b -> a.value <=> b.value}は次の関数を使用するのとほぼ同じです。compare

int compare(a, b) {
  if (a < b) {
    return -1;
  } else if (a > b) {
    return 1;
  } else {
    return 0;
  }
}
于 2012-09-25T00:29:23.370 に答える
8

宇宙船オペレーター<=>はオーバーロードされたオペレーターであり、を表しcompareTo()ます。基本的a<=>bにはと同じですa.compareTo(b)

あなたが与えた例はsort()、クロージャ付きの関数を使用しています(Java8のラムダのように)。その構文は次のとおりです。

.method{ closureParameters-> statements}

したがって、あなたの例はクロージャsort()付きの関数を使用しています。そのクロージャ内では、宇宙船(コンパレータ)演算子を使用します。

演算子のオーバーロードについて詳しくは、こちらをご覧ください

于 2016-02-08T14:19:14.820 に答える