【发布时间】:2019-01-13 23:58:16
【问题描述】:
编辑:
我不得不退回一组享有大部分折扣的乘客。这个谜题的解法如下,
- 提取地图中的所有乘客数量
- 提取地图中的所有乘客计数 收到折扣。
- 然后在循环中我必须应用 lambda 来查找百分比并查看是否 哪些乘客在大部分行程中获得了折扣。
- 将它们添加到集合中并返回。
请看下面的代码,
fun findDiscountedPassengers(): Set<Passenger> {
var discountedPassengerList: MutableList<Passenger> = emptyList<Passenger>().toMutableList()
var passengerTripCountMap = trips.flatMap { it.passengers }.groupingBy { it }.eachCount()
var passengerDiscountedTripsMap = trips.filter { it.discount != null }
.flatMap { it: Trip -> it.passengers }
.groupingBy { it }
.eachCount()
val findPercentage = ...
passengerDiscountedTripsMap.forEach { it: Map.Entry<Passenger, Int> ->
val totalTripsCount: Double? = passengerTripCountMap.get(it.key)?.toDouble()
if (findPercentage(it.value.toDouble(), totalTripsCount?:0.0) > majorPercentage) {
discountedPassengerList.add(it.key)
}
}
return discountedPassengerList.toSet()
}
我的代码似乎比 Kotlin 更像 Java,因为它没有那么简洁/简短或优化。我创建了两个不同的组,产生了两个地图;然后创建一个循环来应用其余的逻辑。我认为可以删除一些不必要的步骤。
示例:将列表转换为设置以返回结果等。
如何避免创建两个组导致两个不同的地图?我可以从第 1 步到第 4 步应用哪些优化?我可以以任何方式利用 Partition(不确定这个概念)来减少我在上面的代码中采取的步骤数吗?
谢谢。
【问题讨论】:
-
我不确定我的理解是否正确,但如果您想根据某个谓词拆分列表,partition 运算符在这里可能很有用。例如。
trips.partition { it.discount != null && it.discount > 0.0 }将返回一对带折扣和不带折扣的旅行。 -
我不确定你在那里做什么。为什么你做一个
eachCount然后只拿钥匙?可以分享一下数据结构吗? -
如果您可以在 java 中做到这一点,您可能需要考虑共享 java(伪)代码。代码通常比自然语言更清晰。
-
很抱歉给您带来了困惑。让我把我的完整解决方案连同我试图解决的问题一起放在这里。在一些你会看到我在问题中的编辑。
标签: java kotlin kotlin-android-extensions kotlin-extension