Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
リスト — sortedBy() / sortedWith()
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("Alice", 30), Person("Bob", 25))
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 { キー } | 可変リストをキーで破壊的にソートします。 |
サンプルコード
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()
val products = listOf(
Product("りんご", 150, 4.5),
Product("バナナ", 100, 3.8),
Product("ぶどう", 500, 4.9),
Product("オレンジ", 200, 4.2),
Product("メロン", 800, 4.7)
)
// 価格の昇順
val byPrice = products.sortedBy { it.price }
println("価格昇順:")
byPrice.forEach { println(" ${it.name}: ${it.price}円") }
println()
// 評価の降順
val byRating = products.sortedByDescending { it.rating }
println("評価降順:")
byRating.forEach { println(" ${it.name}: ${it.rating}") }
println()
// 複数キーでソート(評価降順、同値なら価格昇順)
val multiSort = products.sortedWith(
compareByDescending<Product> { it.rating }.thenBy { it.price }
)
println("評価降順→価格昇順:")
multiSort.forEach { println(" ${it.name}: 評価${it.rating} ${it.price}円") }
println()
// 文字列のソート
val names = listOf("Carol", "Alice", "Bob", "Dave")
println("アルファベット順: ${names.sorted()}")
println("逆順: ${names.sortedDescending()}")
// 大文字小文字を無視したソート
val mixed = listOf("banana", "Apple", "cherry", "Date")
println("大文字小文字無視: ${mixed.sortedWith(compareBy { it.lowercase() })}")
}
概要
『sortedBy()』は非破壊(元のリストを変更しない)なのに対し、MutableListの『sortBy()』は破壊的に変更します。不変リスト(listOf)では破壊的なソートは使えません。
複数キーのソートは『compareBy({ キー1 }, { キー2 })』または『compareByDescending<型> { キー1 }.thenBy { キー2 }』のように書きます。後者の方が柔軟に昇順・降順を混在できます。
グルーピングと分割はリスト — groupBy() / partition()を、畳み込みはリスト — reduce() / fold()を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。