web-dev-qa-db-ja.com

Kotlinオブジェクト式:コンパレータの例

このコードは基本的に配列を降順で並べ替えます。

_val arrayList = arrayListOf(1, 5, 2)

Collections.sort(arrayList, object : Comparator<Int> {
   override fun compare(x : Int, y: Int) = y - x
})
_

比較メソッドを_y - x_でオーバーライドすることは、どのように機能しますか? Kotlinは_y - x_の場合、yxの前に配置する__y < x_の意味をどのようにして知っていますか?

15
Rafael Saraiva

これは実際にはKotlinとは関係ありません。これは、Java APIのComparatorインターフェース、およびCollections.sortがそれを使用する方法に関連しています。

ドキュメント: から

2つの引数の順序を比較します。最初の引数が2番目の引数より小さい、等しい、または大きい場合、負の整数、ゼロ、または正の整数を返します。

今あなたが与えた議論のためにこれを試してみましょう:

  • 1-5 = -4(負の整数)なので、1は5未満です。
  • 5-2 = 3(正の整数)なので、5は2より大きい。
  • 等...

Collections.sorty-xの意味について何も知りません。それは単に、任意の実装者が尊重する必要があるComparatorインターフェースの定義された規約を尊重するだけです(それが機能したい場合)。

たまたまそうですy - xはMathなので、その契約を尊重する実装です。

20
eski

ComparatorはSAMインターフェイスであるため、ラムダを使用してこのコードをより簡潔に記述できます。

Collections.sort(arrayList, {x : Int, y: Int -> y - x})

あるいは

Collections.sort(arrayList) {
    x, y -> y - x
}

ラムダはsort関数の最後のパラメーターであり、xyのデータ型を推測できるためです。


2つのオブジェクトを取得し、それらに対して単一の整数を定義する必要があるのは、ソート定義の抽象概念です。基本的に、並べ替えられた場合にこれらの要素が配置される順序を指定します。

整数を並べ替えるのはやり過ぎに思えるかもしれませんが、クラスCarのインスタンスの例など、より複雑なオブジェクトを並べ替える必要があることを考慮してください。

このクラスにはcolorCodeがあり、それを基準に並べ替えます。

Collections.sort(cars) {
    car1, car2 -> car1.colorCode - car2.colorCode
}

これが、これらのオブジェクトの順序を抽象的な方法で定義する方法です。

4
Willi Mentzel

Kotlinでは、kotlinコレクション拡張関数sort、sorted、sortBy ...などを使用して要素を並べ替えることもできます。

val arrayList = arrayListOf(1, 5, 2).sorted() //1,2,5

または

val arrayList = arrayListOf(1, 5, 2).sortedDescending() //5,2,1
1
Fredy Mederos