Редактировать
Мне пришлось вернуть набор пассажиров, у которых было большинство скидок. Решение этой загадки было следующим:
- Извлечь всех пассажиров на карту
- Извлеките всех пассажиров на карте, которые
полученные скидки.
- Затем в цикле мне пришлось применить лямбду, чтобы найти процент и посмотреть,
какие пассажиры получили скидку на большинство поездок.
- Добавьте их в набор и верните.
Пожалуйста, смотрите код ниже,
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 (не уверен насчет концепции), чтобы уменьшить количество шагов, которые я предпринял в приведенном выше коде?
Спасибо.