Kotlinでの並べ替えのガイド
1. 概要
Kotlinは、拡張メソッドを使用してJavaコレクションフレームワーク上に構築されます。 これにより、 ApacheCommonsや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 または逆メソッドを使用して、降順でソートすることができます。
2.2. 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には、ビルドに非常に便利なパッケージが含まれていますコンパレータ –
- コンパレータの作成
- null値の処理
- 順序を逆にする
- コンパレータルール拡張
3.1. コンパレータ作成
コンパレータの作成を簡素化するために、 Kotlinは、コードをより表現力豊かにするための多くのファクトリメソッドを提供します。
利用可能な最も単純なコンパレータファクトリはnaturalOrder() です。引数は不要で、デフォルトでは順序は昇順です。
val ascComparator = naturalOrder<Long>()
複数のプロパティを持つオブジェクトの場合、compareByメソッドを使用できます。 引数として、それぞれが Compareable オブジェクトを返す可変数の関数(並べ替えルール)を指定します。 次に、結果の Compareable オブジェクトが等しくないと評価されるまで、またはすべての関数が呼び出されるまで、これらの関数が順番に呼び出されます。
次の例では、it。first値が比較に使用され、値が等しい場合にのみ、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のにあります。