Kotlin:对集合的多种操作

时间:2019-01-13 23:58:17

标签: java kotlin kotlin-android-extensions kotlin-extension

修改

我不得不退回了大部分折扣的乘客。解决这个难题的方法如下,

  1. 提取地图中所有乘客的数量
  2. 提取地图中所有计数为 收到折扣。
  3. 然后在循环中,我必须应用lambda来找到百分比并查看是否 哪些乘客在大多数旅行中获得折扣。
  4. 将它们添加到集合中并返回。

请参见下面的代码,

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,我可以应用哪些优化?我可以以任何方式利用分区(不确定概念)来减少我在上面的代码中采取的步骤吗?

谢谢。

1 个答案:

答案 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获得的两个结果列表中。