Kotlinでソートするためのガイド

Kotlinの並べ替えガイド

1. 概要

Kotlinは、extension methodsを使用してJavaコレクションフレームワーク上に構築されます。 これにより、Apache CommonsGuavaなどのサードパーティの依存関係を必要とせずに、使いやすさと読みやすさが劇的に向上します。

このチュートリアルでは、Kotlinでの並べ替えに焦点を当てます。 また、kotlin.comparisonsパッケージを使用して、複雑な順序付けルールを実装します。

2. コレクションの並べ替え

Kotlinには、コレクションのソートプロセスを簡単にする複数のユーティリティが用意されています。 これらの方法のいくつかを見てみましょう。

2.1. Sort

The simplest way to sort a collection is to call the sort method.このメソッドは、要素の自然な順序を使用します。 また、デフォルトでは昇順で並べられるため、「a」は「b」の前にあり、「1」は「2」の前にあります。

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

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

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

変更可能なコレクションを使用していることに注意してください。 その理由は、the sort method will sort in-placeです。 結果を新しいリストとして返したい場合は、代わりにsortedメソッドを使用する必要があります。

さらに、sortDescendingまたはreverseメソッドを使用して、降順で並べ替えることができます.

2.2. SortBy

特定のオブジェクトの特定のプロパティで並べ替える必要がある場合は、sortBy. The sortBy method allows us to pass a selector function as an argument.を使用できます。セレクター関数はオブジェクトを受け取り、並べ替える値を返す必要があります。

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には、Comparatorkotlin.comparisons. を構築するための非常に便利なパッケージが含まれています。次のセクションでは、以下について説明します。

  • Comparatorの生成

  • null値の処理

  • 順序を逆にする

  • Comparatorルール拡張

3.1. Comparatorの作成

Comparator, Kotlinの作成を簡素化するために、コードをより表現力豊かにする多くのファクトリメソッドが用意されています。

使用可能な最も単純なComparatorファクトリはnaturalOrder().です。引数は不要で、デフォルトでは順序が昇順です。

val ascComparator = naturalOrder()

複数のプロパティを持つオブジェクトの場合、compareByメソッドを使用できます。 引数として、それぞれがComparableオブジェクトを返す可変数の関数(並べ替えルール)を指定します。 次に、結果のComparableオブジェクトが等しくないと評価されるまで、またはすべての関数が呼び出されるまで、これらの関数が順番に呼び出されます。

次の例では、itfirstの値が比較に使用され、値が等しい場合にのみ、it.secondが呼び出されて同点が解消されます。

val complexComparator = compareBy>({it.first}, {it.second})

利用可能なすべてのファクトリを見つけるために、kotlin.comparisonsを自由に探索してください。

3.2. null値の処理

nullの値処理でComparatorを改善する簡単な方法は、nullsFirstまたはnullsLastメソッドを使用することです。 これらのメソッドは、null値をそれぞれ最初または最後の場所でソートします。

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

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

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

結果のコレクションの最後の値は、nullの値を持つものであることがわかります。

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> {it.first}
val ageAndNameComparator = ageComparator.thenByDescending {it.second}
println(students.sortedWith(ageAndNameComparator))

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

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

4. 結論

このクイックチュートリアルでは、Kotlinでコレクションを並べ替えるために、sortsortBy、およびsortWithメソッドを使用する方法を説明しました。

その後、kotlin.comparisonsパッケージを使用して、Comparatorオブジェクトを作成し、追加の並べ替えルールでそれらを拡張しました。

これらすべての例とスニペットの実装は、over on GitHubにあります。