🙌

kotlin.collectionsのソート

2022/10/02に公開

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