修改:
我不得不退回了大部分折扣的乘客。解决这个难题的方法如下,
请参见下面的代码,
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,我可以应用哪些优化?我可以以任何方式利用分区(不确定概念)来减少我在上面的代码中采取的步骤吗?
谢谢。
答案 0 :(得分:1)
正如评论中已经提到的那样,我不太了解您的用例,我认为您对groupingBy
的使用没有意义。您正在尝试计算trips
内部出现的乘客人数,而我的建议是:#
val (passengersWithDiscount, passengersWithoutDiscount) = trips.partition { it.discount != null && it.discount > 0.0 }.let { (with, withOut) ->
val counter = { trips: List<Trip> -> trips.flatMap { it: Trip -> it.passengers }.count() }
counter(with) to counter(withOut)
}
使用partition
,我们根据条件分割数据。此后,我们声明一个计数器函数,该函数将List<Trip>
转换为其乘客人数。然后,此功能将应用于从partition
获得的两个结果列表中。