[毎日Kotlin] Day28. Sort

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

毎日Kotlinシリーズです。

このシリーズを初めての方はこちらです。「毎日Kotlin」はじめました | Developers.IO

問題

Sort | Try Kotlin

Implement Shop.getCustomersSortedByNumberOfOrders() using sorted or sortedBy.

listOf("bbb", "a", "cc").sorted() == listOf("a", "bbb", "cc")
listOf("bbb", "a", "cc").sortedBy { it.length } == listOf("a", "cc", "bbb")
// Return a list of customers, sorted by the ascending number of orders they made
fun Shop.getCustomersSortedByNumberOfOrders(): List<Customer> = TODO()

data class Shop(val name: String, val customers: List<Customer>)
 
data class Customer(val name: String, val city: City, val orders: List<Order>) {
    override fun toString() = "$name from ${city.name}"
}
 
data class Order(val products: List<Product>, val isDelivered: Boolean)
 
data class Product(val name: String, val price: Double) {
    override fun toString() = "'$name' for $price"
}
 
data class City(val name: String) {
    override fun toString() = name
}

狙い

ここで考えて欲しい問題の意図はなんだろうか?

コレクションを処理する便利関数はたくさんあるので使って覚えよう。

解答例

fun Shop.getCustomersSortedByNumberOfOrders(): List<Customer> =
    customers.sortedBy { it.orders.size }

Javaのコレクションクラスを使用したわかりやすい等価コードです。

fun Shop.getCustomersSortedByNumberOfOrders(): List<Customer> {
    val list = customers.toMutableList()
    Collections.sort(list) { v1, v2 ->
        v1.orders.size - v2.orders.size
    }
    return list
}

sortedByは、各アイテムを同じ要素で並び替えします。比較する要素の取得をラムダで書けばソートされます。{ it.orders.size }

customers.sortedByの内部の実装では、Collections.sortを使用してるので、便利拡張関数として作ってくれているだけです。

sortedBy at 1.2.20 · JetBrains/kotlin

sortWith at 1.2.20 · JetBrains/kotlin

あとがき

Day29.でまたお会いしましょう。