1. 概要

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

このチュートリアルでは、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 またはメソッドを使用して、降順でソートすることができます。

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メソッドを使用できます。

コンパレータオブジェクトを引数として渡すことができます。 Kotlinでは、コンパレータオブジェクトを作成する方法が複数あります。これについては、次のセクションで説明します。

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 methodの代わりにsortedWithメソッドを使用する必要があります。

降順の場合は、 reverse メソッドを使用するか、代わりに適切なコンパレータを定義できます。

3. 比較

Kotlinには、ビルドに非常に便利なパッケージが含まれていますコンパレータ kotlin.comparisons。 次のセクションでは、以下について説明します。

  • コンパレータの作成
  • null値の処理
  • 順序を逆にする
  • コンパレータルール拡張

3.1. コンパレータ作成

コンパレータの作成を簡素化するために、 Kotlinは、コードをより表現力豊かにするための多くのファクトリメソッドを提供します。

利用可能な最も単純なコンパレータファクトリはnaturalOrder() です。引数は不要で、デフォルトでは順序は昇順です。

val ascComparator = naturalOrder<Long>()

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

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

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

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

3.2. null値の処理

コンパレータnull値の処理で改善する簡単な方法は、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 メソッドまたは逆転方法前者のメソッドには引数がなく、降順を返します。 後者のメソッドは、コンパレータオブジェクトに適用でき、逆にされたコンパレータオブジェクトを返します。

自然な降順を使用してコンパレータを構築するには、次のようにします。

reverseOrder()

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

コンパレータオブジェクトは、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 パッケージを使用して、コンパレータオブジェクトを作成し、追加の並べ替えルールでそれらを拡張しました。

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