Kotlin Koans用fold实现查询所有客户共购商品未通过求解答
问题排查与修复
错误原因
- 核心逻辑与需求相悖:你当前的实现返回的是所有客户订购过的商品的并集,只要任意一个客户买过的商品都会被纳入结果,而题目要求返回的是所有客户都订购过的商品的交集,只有被每一位客户都购买过的商品才能进入结果集合。
- fold操作逻辑错误:你使用空可变集合作为初始值,遍历过程中执行
collector.plus(c.getOrderedProducts())是将当前客户的订购商品合并到已有集合中,最终结果只会不断新增元素,完全没有过滤掉未被所有客户购买的商品,自然不符合要求。
修复后代码
// Return the set of products that were ordered by all customers fun Shop.getProductsOrderedByAll(): Set<Product> { // 无客户时直接返回空集合 if (customers.isEmpty()) return emptySet() // 初始值取第一个客户的订购商品集合,后续逐个取交集 return customers.fold(customers.first().getOrderedProducts().toSet()) { sharedProducts, customer -> sharedProducts.intersect(customer.getOrderedProducts()) } } fun Customer.getOrderedProducts(): List<Product> = orders.flatMap { it.products }
逻辑说明
intersect()是Kotlin集合内置的交集计算方法,返回同时存在于两个集合中的元素- 遍历每一位客户时,我们只保留已经被前面所有客户订购过、同时也被当前客户订购过的商品
- 遍历完所有客户后,最终得到的交集就是所有客户都订购过的商品集合
内容的提问来源于stack exchange,提问作者FailedUnitTest
相关产品推荐
相关产品推荐

