1.概要

Kotlinは、https://www.baeldung.com/kotlin-extension-methods[拡張メソッド]を使用して、Java Collectionフレームワークの上に構築されています。

これにより、https://www.baeldung.com/apache-commons-collection-utils[Apache Commons]やhttps://www.baeldung.com/guava-などのサードパーティの依存関係を必要とせずに、ユーザビリティと読みやすさが劇的に向上します。コレクション[グアバ]。

このチュートリアルでは、Kotlinでのソートに焦点を当てます。また、私たちは

kotlin.comparisons

パッケージを使用して複雑な順序付けルールを実装します。

2.コレクションをソートする

Kotlinはコレクションをソートするプロセスをより簡単にするために複数のユーティリティを提供します。これらの方法のいくつかを調べてみましょう。

2.1.

ソート

  • コレクションをソートする最も簡単な方法は

    sort

    メソッドを呼び出すことです** このメソッドは要素の自然な順序を使います。また、デフォルトでは昇順になっているので、「a」は「b」の前、「1」は「2」の前になります。

val sortedValues = mutableListOf(1, 2, 7, 6, 5, 6)
sortedValues.sort()
println(sortedValues)

そして上記のコードの結果は次のとおりです。

----[1, 2, 5, 6, 6, 7]----

可変コレクションを使用したことに注意することが重要です。その理由は、

sort

メソッドはその場でソートするからです。結果を新しいリストとして返したい場合は、代わりに

sorted

メソッドを使用する必要があります。

さらに、

sortDescending

または

reverse

メソッドを使用して降順でソートすることもできます


_.

_

2.2.

並び替え

特定のオブジェクトの特定のプロパティでソートする必要がある場合は、

__sortByを使用できます。





sortBy__メソッドを使用すると、セレクター関数を引数として渡すことができます。

val sortedValues = mutableListOf(1 to "a", 2 to "b", 7 to "c", 6 to "d", 5 to "c", 6 to "e")
sortedValues.sortBy { it.second }
println(sortedValues)

そして上記のコードの結果は次のとおりです。

----[(1, a), (2, b), (7, c), (5, c), (6, d), (6, e)]----

繰り返しになりますが、

sortBy

メソッドはその場でソートされるため、コレクションは変更可能である必要があります。結果を新しいリストとして返す場合は、

sortBy

メソッドの代わりに

sortedBy

メソッドを使用する必要があります。

以前と同様に、降順では

sortByDescending

または

reverse

メソッドを使用できます。

2.3.

SortWith

より高度な使用方法(複数のルールを組み合わせるなど)では、

sortWith

メソッドを使用できます。

引数として

Comparator

オブジェクトを渡すことができます。 Kotlinでは、

Comparator

オブジェクトを作成する方法が複数あります。これについては次のセクションで説明します。

val sortedValues = mutableListOf(1 to "a", 2 to "b", 7 to "c", 6 to "d", 5 to "c", 6 to "e")
sortedValues.sortWith(compareBy({it.second}, {it.first}))
println(sortedValues)

そして上記のコードの結果は、それらが文字順にソートされ、それから番号順にソートされるということです。

----[(1, a), (2, b), (5, c), (7, c), (6, d), (6, e)]----


sortWith

はその場でソートを行うので、可変コレクションを使用する必要があります。結果を新しいコレクションとして返したい場合は、

sortWith

メソッド

__.


の代わりに

sortedWith__メソッドを使用する必要があります。

降順にするには、

reverse

メソッドを使用するか、代わりに正しい

Comparator

を定義します。

3.比較

Kotlinには、

Comparator



__kotlin.comparisonsを構築するための非常に便利なパッケージが含まれています。

__次のセクションでは、議論します。


  • コンパレータ

    作成


  • null

    値の取り扱い

  • 順番を逆にする


  • 比較

    ルール拡張

3.1.

コンパレータ

作成

私たちの


_Comparatorの作成を簡単にするために、

_

Kotlinは私たちのコードをより表現力豊かにするために多くのファクトリーメソッドをもたらします。

利用可能な最も単純な

Comparator

ファクトリは__naturalOrder()です。

……
val ascComparator = naturalOrder <ロング>()
……

複数のプロパティを持つオブジェクトの場合は、

compareBy

メソッドを使用できます。

引数として、それぞれが

Comparable

オブジェクトを返す可変数の関数(ソート規則)を与えます。その後、それらの関数は、結果の

Comparable

オブジェクトが等しくないと評価されるまで、またはすべての関数が呼び出されるまで順番に呼び出されます。

次の例では、

it

.

first

valueが比較に使用され、値が等しい場合にのみ

it.second

が呼び出されて結合が解除されます。

……
val complexComparator = compareBy <Pair <Int、String?>>({it.first}、{it.second})
……

すべての利用可能な工場を発見するために

kotlin.comparisons

を探検してください。

3.2.

null

値の取り扱い


null

値処理を使用して

Comparator

を改善する簡単な方法は、

nullsFirst

または

nullsLast

メソッドを使用することです。これらのメソッドはそれぞれ

null

値を最初または最後の場所にソートします。

……
val sortedValues = mutableListOf(1から “a”、2からnull、7から “c”、6から “d”、5から “c”、6から “e”)
sortedValues.sortWith(nullsLast(compareBy {it.second}))
println(sortedValues)
……

上記のコードの結果は次のようになります。

----[(1, a), (7, c), (5, c), (6, d), (6, e), (2, null)]----

結果のコレクションの最後の値が

null

valueを持つものであることがわかります。

3.3. 順序を逆にする

順序を逆にするには、

reverseOrder

メソッドまたは

reversed

メソッドを使用することができます。後者のメソッドは、

Comparator

オブジェクトに適用でき、その逆の

Comparator

オブジェクトを返します。

降順の自然順を使用して

Comparator

を構築するには、次のようにします。

reverseOrder()

3.4. コンパレータルールの拡張


comparator

オブジェクトは、

kotlin.comparable

パッケージで利用可能な

then

メソッドを介して、追加のソート規則と組み合わせたり拡張することができます。

最初のコンパレータが等しいと評価された場合にのみ、2番目のコンパレータが使用されます。

私たちの学生のリストには、各個人の年齢と名前が含まれています。我々はそれらを最も若いものから最も古いものへとソートし、そしてそれらが同じ年齢である場合には、名前に基づいて降順にしたい:

val students = mutableListOf(21 to "Helen", 21 to "Tom", 20 to "Jim")

val ageComparator = compareBy<Pair<Int, String?>> {it.first}
val ageAndNameComparator = ageComparator.thenByDescending {it.second}
println(students.sortedWith(ageAndNameComparator))

上記のコードの結果は次のようになります。

----[(20, Jim), (21, Tom), (21, Helen)]----

4.まとめ

このクイックチュートリアルでは、Kotlinでコレクションをソートするために

sort



sortBy

、および

sortWith

メソッドを使用する方法を説明しました。

後で、

kotlin.comparisons

パッケージを使用して

Comparator

オブジェクトを作成し、追加のソート規則でそれらを強化しました。

これらすべての例とスニペットの実装はhttps://github.com/eugenp/tutorials/tree/master/core-kotlin[GitHubで動く]にあります。