リスト — 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("孫悟空", 30), Person("ブルマ", 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 Fighter(val name: String, val power: Int, val speed: Double)
val fighters = listOf(
Fighter("孫悟空", 9000, 4.9),
Fighter("ベジータ", 8000, 4.7),
Fighter("ブルマ", 10, 3.5),
Fighter("クリリン", 1000, 4.2),
Fighter("ピッコロ", 3500, 4.5)
)
// 戦闘力の昇順
val byPower = fighters.sortedBy { it.power }
println("戦闘力昇順:")
byPower.forEach { println(" ${it.name}: ${it.power}") }
println()
// スピードの降順
val bySpeed = fighters.sortedByDescending { it.speed }
println("スピード降順:")
bySpeed.forEach { println(" ${it.name}: ${it.speed}") }
println()
// 複数キーでソート(スピード降順、同値なら戦闘力昇順)
val multiSort = fighters.sortedWith(
compareByDescending<Fighter> { it.speed }.thenBy { it.power }
)
println("スピード降順→戦闘力昇順:")
multiSort.forEach { println(" ${it.name}: スピード${it.speed} 戦闘力${it.power}") }
println()
// 文字列のソート
val names = listOf("孫悟空", "ベジータ", "ブルマ", "クリリン")
println("アルファベット順: ${names.sorted()}")
println("逆順: ${names.sortedDescending()}")
// キャラクターと曲のペアリスト
val charSongs = listOf(
"孫悟空" to "CHA-LA HEAD-CHA-LA",
"ベジータ" to "DAN DAN 心魅かれてく",
"ブルマ" to "魔訶不思議アドベンチャー!"
)
val sortedByName = charSongs.sortedBy { it.first }
sortedByName.forEach { (name, song) -> println("$name: $song") }
// 大文字小文字を無視したソート
val mixed = listOf("Vegeta", "son goku", "BULMA", "krillin")
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] 戦闘力昇順: ブルマ: 10 クリリン: 1000 ピッコロ: 3500 ベジータ: 8000 孫悟空: 9000 スピード降順: 孫悟空: 4.9 ベジータ: 4.7 ピッコロ: 4.5 クリリン: 4.2 ブルマ: 3.5 スピード降順→戦闘力昇順: 孫悟空: スピード4.9 戦闘力9000 ベジータ: スピード4.7 戦闘力8000 ピッコロ: スピード4.5 戦闘力3500 クリリン: スピード4.2 戦闘力1000 ブルマ: スピード3.5 戦闘力10 アルファベット順: [クリリン, ブルマ, ベジータ, 孫悟空] 逆順: [孫悟空, ベジータ, ブルマ, クリリン] 大文字小文字無視: [BULMA, krillin, son goku, Vegeta] ブルマ: 魔訶不思議アドベンチャー! ベジータ: DAN DAN 心魅かれてく 孫悟空: CHA-LA HEAD-CHA-LA
概要
『sortedBy()』は非破壊(元のリストを変更しない)なのに対し、MutableListの『sortBy()』は破壊的に変更します。不変リスト(listOf)では破壊的なソートは使えません。
複数キーのソートは『compareBy({ キー1 }, { キー2 })』または『compareByDescending<型> { キー1 }.thenBy { キー2 }』のように書きます。後者の方が柔軟に昇順・降順を混在できます。
グルーピングと分割はリスト — groupBy() / partition()を、畳み込みはリスト — reduce() / fold()を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。