Не могу сказать, почему сбор и сворачивание не эквивалентны - PullRequest
0 голосов
/ 19 апреля 2020

Я прохожу курс Kotlin Коанов. И я в секции сгиба .

ДАН

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.getOrderedProducts(): Set<Product> =
    customers.flatMap(Customer::orders).flatMap(Order::products).toSet()

Вопрос просит меня сделать следующее: Возврат набор продуктов, которые были заказаны всеми покупателями. Вот мой ответ, который по какой-либо причине не принимается ( Вы указали бы ошибку? )

// Return the set of products that were ordered by all customers
fun Shop.getProductsOrderedByAll(): Set<Product> =
    customers.flatMap(Customer::orders)
        .map(Order::products)
        .reduce{ acc, el -> (acc.intersect(el)).toList()}
        .toSet()

Вот правильный ответ:

// Return the set of products that were ordered by all customers
fun Shop.getProductsOrderedByAll(): Set<Product> {
    val allProducts = customers.flatMap { it.getOrderedProducts() }.toSet()
    return customers.fold(allProducts, { orderedByAll, customer ->
        orderedByAll.intersect(customer.getOrderedProducts())
    })
}

Хотя я не оспариваю их ответ - я могу следовать за ним без проблем - я не понимаю, почему мой ответ неправильный.

1 Ответ

0 голосов
/ 19 апреля 2020

Я наконец понял это. Я предполагал, что каждый клиент эквивалентен одному заказу, но это не так. Каждый клиент может разместить несколько заказов. И вопрос заключается в том, чтобы пересекать продукты по каждому клиенту, а не по продукту в заказе

...