🙌
kotlin.collectionsのソート
Kotlin: 1.7.10
sortedBy, sortedByDescending
セレクタが1つの場合に使用する
data class User(val name: String, val age: Int)
val users = listOf(User("Alice", 1), User("Steve", 2), User("Bob", 4))
名前の昇順でソート
val sorted = users.sortedBy { it.name } // または sortedBy(User::name)
println(sorted) // [User(name=Alice, age=1), User(name=Bob, age=4), User(name=Steve, age=2)]
名前の降順でソート
val sorted = users.sortedByDescending { it.name } // または sortedByDescending(User::name)
println(sorted) // [User(name=Steve, age=2), User(name=Bob, age=4), User(name=Alice, age=1)]
sorted, sortedDescending
Comparableクラスなら使用できる
data class User(val name: String, val age: Int): Comparable<User> {
// 年齢で比較する
override fun compareTo(other: User): Int = age - other.age
}
年齢の昇順
val sorted = users.sorted()
println(sorted) // [User(name=Alice, age=1), User(name=Steve, age=2), User(name=Bob, age=4)]
年齢の降順
val sorted = users.sortedDescending()
println(sorted) // [User(name=Bob, age=4), User(name=Steve, age=2), User(name=Alice, age=1)]
sortedWith
セレクタが複数の場合に使用する
val users = listOf(User("Alice", 1), User("Steve", 2), User("Bob", 4), User("Grace", 1))
第1ソート:年齢の昇順
第2ソート:名前の降順
val sorted = users.sortedWith(compareBy<User> { it.age }.thenByDescending { it.name })
println(sorted) // [User(name=Grace, age=1), User(name=Alice, age=1), User(name=Steve, age=2), User(name=Bob, age=4)]
第1ソート:年齢の降順
第2ソート:名前の昇順
val sorted = users.sortedWith(compareByDescending<User> { it.age }.thenBy { it.name })
println(sorted) // [User(name=Bob, age=4), User(name=Steve, age=2), User(name=Alice, age=1), User(name=Grace, age=1)]
Discussion