[毎日Kotlin] Day27. Max; min
はじめに
毎日Kotlinシリーズです。
このシリーズを初めての方はこちらです。「毎日Kotlin」はじめました | Developers.IO
問題
Implement Shop.getCustomerWithMaximumNumberOfOrders() and Customer.getMostExpensiveOrderedProduct() using max, min, maxBy, or minBy.
listOf(1, 42, 4).max() == 42 listOf("a", "ab").minBy { it.length } == "a"
// Return a customer whose order count is the highest among all customers fun Shop.getCustomerWithMaximumNumberOfOrders(): Customer? = TODO() // Return the most expensive product which has been ordered fun Customer.getMostExpensiveOrderedProduct(): Product? = TODO()
狙い
ここで考えて欲しい問題の意図はなんだろうか?
コレクションを処理する便利関数はたくさんあるので使って覚えよう。
解答例
fun Shop.getCustomerWithMaximumNumberOfOrders(): Customer? = customers.maxBy { it.orders.size } fun Customer.getMostExpensiveOrderedProduct(): Product? = orders.flatMap { it.products }.maxBy { it.price }
maxByは最大の要素をみつけます。どの要素で比較するのかをラムダで書きます。{ it.orders.size }
わかりやすい等価コードを書きました。
fun max(shop: Shop): Customer? { var maxCustomer: Customer? = null for (customer in shop.customers) { if (customer.orders.size > maxCustomer?.orders?.size ?: -1) { maxCustomer = customer } } return maxCustomer }
minByは最小の要素を見つけます。今回の例ではflatMapで一度データを整形した後に最小を探しています。
あとがき
Day28.でまたお会いしましょう。