Kotlinでは、リストの並び替えを直感的に行える sortedBy
と sortedWith
という便利な関数が用意されています。これらを使うことで、昇順・降順のソートやカスタム比較を簡単に実装できます。
sortedByの基本的な使い方
sortedBy
はリストの各要素から取得した値を基準にして 昇順(小さい順) にソートします。
Kotlin
val numbers = listOf(5, 2, 8, 1, 4)
val sortedNumbers = numbers.sortedBy { it }
println(sortedNumbers) // 出力: [1, 2, 4, 5, 8]
sortedBy
の引数に ソートの基準となる値 を指定することで、オブジェクトリストのソートも簡単に行えます。
Kotlin
data class User(val name: String, val age: Int)
val users = listOf(
User("田中", 30),
User("佐藤", 25),
User("鈴木", 35)
)
val sortedUsers = users.sortedBy { it.age }
println(sortedUsers)
// 出力: [User(name=佐藤, age=25), User(name=田中, age=30), User(name=鈴木, age=35)]
sortedByDescending を使って降順ソート
降順(大きい順)に並び替えたい場合は sortedByDescending
を使用します。
Kotlin
val sortedDescending = numbers.sortedByDescending { it }
println(sortedDescending) // 出力: [8, 5, 4, 2, 1]
オブジェクトリストも同様に、プロパティを基準に降順ソートできます。
Kotlin
val sortedUsersDesc = users.sortedByDescending { it.age }
println(sortedUsersDesc)
// 出力: [User(name=鈴木, age=35), User(name=田中, age=30), User(name=佐藤, age=25)]
sortedWith を使ったカスタムソート
より細かいソートのルールを設定したい場合は、 sortedWith
を使用します。
1. Comparator を指定してソート
Kotlin
val sortedByLength = listOf("Kotlin", "Java", "Python", "C")
.sortedWith(compareBy { it.length })
println(sortedByLength) // 出力: [C, Java, Kotlin, Python]
このように、文字列の長さを基準にソートすることもできます。
2. 複数条件でソート(年齢→名前の順)
Kotlin
val sortedMulti = users.sortedWith(compareBy<User> { it.age }.thenBy { it.name })
println(sortedMulti)
// 出力: [User(name=佐藤, age=25), User(name=田中, age=30), User(name=鈴木, age=35)]
thenBy
を使うことで、同じ年齢の場合は名前でソートするなどのルールを追加できます。
sortedBy vs sortedWith の違い
関数 | 使い方 | 用途 |
---|---|---|
sortedBy | 単純な昇順ソート | 一つのプロパティでソート |
sortedByDescending | 単純な降順ソート | 一つのプロパティで逆順ソート |
sortedWith | カスタムComparatorでソート | 複数条件のソートや特別なルールを適用 |
まとめ
sortedBy
は 単純な昇順ソート に最適sortedByDescending
を使えば 降順ソート も簡単sortedWith
を使うと カスタムルールのソート が可能thenBy
を組み合わせれば 複数条件でのソート もできる
データの並び替えを柔軟に行いたい場合は、これらの関数を適切に活用して、より可読性の高いコードを書いてみましょう!