Котлин: множественные операции над коллекциями - PullRequest
0 голосов
/ 14 января 2019

Редактировать

Мне пришлось вернуть набор пассажиров, у которых было большинство скидок. Решение этой загадки было следующим:

  1. Извлечь всех пассажиров на карту
  2. Извлеките всех пассажиров на карте, которые полученные скидки.
  3. Затем в цикле мне пришлось применить лямбду, чтобы найти процент и посмотреть, какие пассажиры получили скидку на большинство поездок.
  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()
}

Мой код кажется немного более понятным на Java, чем Kotlin, поскольку он не такой краткий / короткий или оптимизированный. Я создал две разные группы, в результате чего две карты; затем создайте цикл для применения остальной логики. Я думаю, что все ненужные шаги могут быть удалены.

Пример : преобразование списка в набор для возврата результата и т. Д.

Как мне избежать создания двух групп, в результате чего получаются две разные карты? Какие оптимизации я могу применить от шагов 1 до 4? Могу ли я каким-либо образом использовать Partition (не уверен насчет концепции), чтобы уменьшить количество шагов, которые я предпринял в приведенном выше коде?

Спасибо.

1 Ответ

0 голосов
/ 14 января 2019

Как уже упоминалось в комментариях, я не совсем понимаю ваш вариант использования, и я думаю, что использование 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.

...