gpt4 book ai didi

dictionary - 更新 Kotlin 中特定键的映射值

转载 作者:行者123 更新时间:2023-12-03 16:44:55 27 4
gpt4 key购买 nike

我是 Kotlin 的新手,正在努力学习这门语言。

我有一个函数返回 DayofWeek 作为键和 Int 作为值。

我面临的问题是,我需要获取一个对象列表,其中包含另一个对象列表,其中有一个 Int 值,每次我看到相同的值时我都需要保存和递增。

这是我的功能-

class OrdersAnalyzer {
data class Order(val orderId: Int, val creationDate: LocalDateTime, val orderLines: List<OrderLine>)

data class OrderLine(val productId: Int, val name: String, val quantity: Int, val unitPrice: BigDecimal)


fun totalDailySales(orders: List<Order>) : Map<DayOfWeek, Int> {
val map: MutableMap<DayOfWeek, Int>? = mutableMapOf(
Pair(DayOfWeek.SUNDAY, 0),
Pair(DayOfWeek.MONDAY, 0),
Pair(DayOfWeek.TUESDAY, 0),
Pair(DayOfWeek.WEDNESDAY, 0),
Pair(DayOfWeek.THURSDAY, 0),
Pair(DayOfWeek.FRIDAY, 0),
Pair(DayOfWeek.SATURDAY, 0)
)
for (order in orders) {
val dayOfWeek = order.creationDate.dayOfWeek
var quantity = 0

map?.put(dayOfWeek, quantity)
}
return map!!
}

}

所以我现在面临的问题是2 -

1) 当是正确的 DayOfWeek 时,如何增加每对的值?我不想替换,我想将它添加到最后一个值。

2) 返回 Map 时,我不想返回值为 0 的 DayOfWeeks,我该怎么做?

最佳答案

这是 the elegant answer 的修改版本由 Arjan 提供, 以及一些测试代码。

更新 Alon Shlider 评论后的答案-- 现在计算所有按星期几分组的订单商品数量:

fun totalDailySales(orders: List<Order>): Map<DayOfWeek, Int> =
orders.groupBy { it.creationDate.dayOfWeek }
.mapValues { sumItemQuantities(it.value) }

fun sumItemQuantities(orders: List<Order>) =
orders.flatMap { it.orderLines.map { line -> line.quantity } }.sum()

fun main() {
val orders = listOf(
Order(
1,
LocalDateTime.now().minusDays(2),
listOf(
OrderLine(6, "laptop", 28, 1200.toBigDecimal())
)
),
Order(
2,
LocalDateTime.now().minusDays(1),
listOf(
OrderLine(496, "VR headset", 6, 400.toBigDecimal())
)
)
)

println(totalDailySales(orders))
}

输出:

{FRIDAY=28, SATURDAY=6}

通过这种方法,Kotlin 函数会为您进行分组和计数。 groupBy 函数创建一个从 DayOfWeek 到订单列表的映射(将所有订单与列表中的同一天分组)。 mapValues 函数通过将列表替换为 sumItemQuantities 函数(对于每个列表)的结果来转换该映射。

在代码的 for 循环中,您可以检索特定日期的当前数量(如果尚未设置,则使用零),将其增加适当的数量,然后存储。要仅返回具有非零值的 map 条目,您可以过滤(返回 totalsPerDay.filter { it.value > 0 })或从空 map 开始。这是你的功能,有一些变化:

fun totalDailySales(orders: List<Order>): Map<DayOfWeek, Int> {
val totalsPerDay = mutableMapOf<DayOfWeek, Int>()

for (order in orders) {
val dayOfWeek = order.creationDate.dayOfWeek
val currentQuantity = totalsPerDay[dayOfWeek] ?: 0

// This is not the best way to increment by the sum of the order
// item quantities...
val orderItemQuantities = sumItemQuantities(listOf(order))
totalsPerDay[dayOfWeek] = currentQuantity + orderItemQuantities
}

return totalsPerDay
}

调用后输出:

println(OrdersAnalyzer().totalDailySales(orders))

{FRIDAY=28, SATURDAY=6}

关于dictionary - 更新 Kotlin 中特定键的映射值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59010672/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com