リスト — sortedBy() / sortedWith()
| 対応: | Kotlin 1.0(2016) |
|---|
Kotlinの『sorted()』は自然順でソートしたリストを返します。『sortedBy()』はキーセレクターでソート、『sortedWith()』は独自のComparatorでソートします。元のリストは変更されません。
構文
val numbers = listOf(3, 1, 4, 1, 5, 9, 2, 6)
// 昇順
val asc = numbers.sorted() // [1, 1, 2, 3, 4, 5, 6, 9]
// 降順
val desc = numbers.sortedDescending() // [9, 6, 5, 4, 3, 2, 1, 1]
// キーでソート
data class Person(val name: String, val age: Int)
val people = listOf(Person("member_a", 30), Person("member_b", 16))
val byAge = people.sortedBy { it.age } // 年齢昇順
// 複数キーでソート(compareBy)
val byAgeThenName = people.sortedWith(compareBy({ it.age }, { it.name }))
メソッド一覧
| メソッド | 概要 |
|---|---|
| リスト.sorted() | 自然順(Comparable)で昇順ソートした新しいリストを返します。 |
| リスト.sortedDescending() | 自然順で降順ソートした新しいリストを返します。 |
| リスト.sortedBy { キー } | キーセレクターで昇順ソートします。 |
| リスト.sortedByDescending { キー } | キーセレクターで降順ソートします。 |
| リスト.sortedWith(Comparator) | 独自のComparatorでソートします。 |
| compareBy { キー } | 単一キーのComparatorを作成します。 |
| compareBy({ キー1 }, { キー2 }) | 複数キーのComparatorを作成します(第1キー同値時に第2キーで比較)。 |
| compareByDescending { キー } | 降順のComparatorを作成します。 |
| MutableList.sort() | 可変リストを破壊的に昇順ソートします。 |
| MutableList.sortBy { キー } | 可変リストをキーで破壊的にソートします。 |
サンプルコード
sample_list_sorted.kt
data class Product(val name: String, val price: Int, val rating: Double)
fun main() {
// 数値のソート
val numbers = listOf(5, 3, 8, 1, 9, 2, 7)
println("昇順: ${numbers.sorted()}")
println("降順: ${numbers.sortedDescending()}")
println()
// メンバーのスコアリスト
data class Member(val name: String, val score: Int, val speed: Double)
val members = listOf(
Member("member_a", 9000, 4.9),
Member("member_b", 8000, 4.7),
Member("member_c", 10, 3.5),
Member("member_d", 1000, 4.2),
Member("member_e", 3500, 4.5)
)
// スコアの昇順
val byScore = members.sortedBy { it.score }
println("スコア昇順:")
byScore.forEach { println(" ${it.name}: ${it.score}") }
println()
// スピードの降順
val bySpeed = members.sortedByDescending { it.speed }
println("スピード降順:")
bySpeed.forEach { println(" ${it.name}: ${it.speed}") }
println()
// 複数キーでソート(スピード降順、同値ならスコア昇順)
val multiSort = members.sortedWith(
compareByDescending<Member> { it.speed }.thenBy { it.score }
)
println("スピード降順→スコア昇順:")
multiSort.forEach { println(" ${it.name}: スピード${it.speed} スコア${it.score}") }
println()
// 文字列のソート
val names = listOf("member_a", "member_b", "member_c", "member_d")
println("アルファベット順: ${names.sorted()}")
println("逆順: ${names.sortedDescending()}")
// 名前と値のペアリスト
val pairs = listOf(
"member_a" to "value_1",
"member_b" to "value_2",
"member_c" to "value_3"
)
val sortedByName = pairs.sortedBy { it.first }
sortedByName.forEach { (name, value) -> println("$name: $value") }
// 大文字小文字を無視したソート
val mixed = listOf("Member_B", "member_a", "MEMBER_C", "member_d")
println("大文字小文字無視: ${mixed.sortedWith(compareBy { it.lowercase() })}")
}
list_sorted.kt
kotlinc list_sorted.kt -include-runtime -d list_sorted.jar java -jar list_sorted.jar 昇順: [1, 2, 3, 5, 7, 8, 9] 降順: [9, 8, 7, 5, 3, 2, 1] スコア昇順: member_c: 10 member_d: 1000 member_e: 3500 member_b: 8000 member_a: 9000 スピード降順: member_a: 4.9 member_b: 4.7 member_e: 4.5 member_d: 4.2 member_c: 3.5 スピード降順→スコア昇順: member_a: スピード4.9 スコア9000 member_b: スピード4.7 スコア8000 member_e: スピード4.5 スコア3500 member_d: スピード4.2 スコア1000 member_c: スピード3.5 スコア10 アルファベット順: [member_a, member_b, member_c, member_d] 逆順: [member_d, member_c, member_b, member_a] member_a: value_1 member_b: value_2 member_c: value_3 大文字小文字無視: [member_a, Member_B, MEMBER_C, member_d]
概要
『sortedBy()』は非破壊(元のリストを変更しない)なのに対し、MutableListの『sortBy()』は破壊的に変更します。不変リスト(listOf)では破壊的なソートは使えません。
複数キーのソートは『compareBy({ キー1 }, { キー2 })』または『compareByDescending<型> { キー1 }.thenBy { キー2 }』のように書きます。後者の方が柔軟に昇順・降順を混在できます。
グルーピングと分割はリスト — groupBy() / partition()を、畳み込みはリスト — reduce() / fold()を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。