web-dev-qa-db-ja.com

コンパレータ構文を使用したグルーヴィーなソート

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

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

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

誰かが{および}意味?

28
F21

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

特定のシナリオでは、比較は spaceship operator<=>を使用した結果です。つまり、要素をascendingの順序で効果的に並べ替えます。

たとえば、リスト[ 3, 2, 1 ]がある場合、そのソートを使用した結果 would be[ 1, 2, 3 ]

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

int compare(a, b) {
  if (a < b) {
    return -1;
  } else if (a > b) {
    return 1;
  } else {
    return 0;
  }
}
43
João Silva

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

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

.method {closureParameters-> statements}

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

演算子のオーバーロードの詳細 here

5
Valdi_K