【问题标题】:Kotlin: Multiple operations on CollectionsKotlin:集合上的多项操作
【发布时间】:2019-01-13 23:58:16
【问题描述】:

编辑

我不得不退回一组享有大部分折扣的乘客。这个谜题的解法如下,

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

谢谢。

【问题讨论】:

  • 我不确定我的理解是否正确,但如果您想根据某个谓词拆分列表,partition 运算符在这里可能很有用。例如。 trips.partition { it.discount != null &amp;&amp; it.discount &gt; 0.0 } 将返回一对带折扣和不带折扣的旅行。
  • 我不确定你在那里做什么。为什么你做一个eachCount 然后只拿钥匙?可以分享一下数据结构吗?
  • 如果您可以在 java 中做到这一点,您可能需要考虑共享 java(伪)代码。代码通常比自然语言更清晰。
  • 很抱歉给您带来了困惑。让我把我的完整解决方案连同我试图解决的问题一起放在这里。在一些你会看到我在问题中的编辑。

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


【解决方案1】:

正如 cmets 中已经提到的,我不太了解您的用例,我认为您对 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&lt;Trip&gt; 转换为它的乘客数量。然后将此函数应用于我们从partition 获得的两个结果列表。

【讨论】:

  • 请立即查看问题。
猜你喜欢
  • 2016-04-14
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-17
相关资源
最近更新 更多