Dictionary 正在更新Kotlin中特定密钥的映射值
我是科特林的新手,正在努力学习这门语言 我有一个函数,它返回DayofWeek作为键,返回Int作为值 我面临的问题是,我需要获取一个对象列表,该列表中有另一个对象列表,该列表中有一个Int值,每次看到相同的值时,我都需要保存并递增该值 这是我的职责-Dictionary 正在更新Kotlin中特定密钥的映射值,dictionary,kotlin,Dictionary,Kotlin,我是科特林的新手,正在努力学习这门语言 我有一个函数,它返回DayofWeek作为键,返回Int作为值 我面临的问题是,我需要获取一个对象列表,该列表中有另一个对象列表,该列表中有一个Int值,每次看到相同的值时,我都需要保存并递增该值 这是我的职责- class OrdersAnalyzer { data class Order(val orderId: Int, val creationDate: LocalDateTime, val orderLines: List<Orde
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!!
}
}
class OrdersAnalyzer{
数据类顺序(val orderId:Int,val creationDate:LocalDateTime,val orderLines:List)
数据类订单行(val productId:Int,val名称:字符串,val数量:Int,val单价:BigDecimal)
趣味totalDailySales(订单:列表):地图{
val映射:可变映射?=可变映射(
配对(星期日,星期日,0),
配对(星期一,星期一,0),
配对(星期二,0),
配对(星期三,0),
配对(星期四,0),
配对(星期五,星期五,0),
配对(星期五、星期六,0)
)
对于(订单中的订单){
val dayOfWeek=order.creationDate.dayOfWeek
变量数量=0
地图?放置(星期几,数量)
}
返回地图!!
}
}
所以我现在面临的问题是2-
1) 当它是相应的DayOfWeek时,如何增加每对的值?我不想替换,我想将其添加到最后一个值
2) 返回地图时,我不想返回值为0的DayOfWeeks。我该怎么做 更新了答案(也感谢),带有一些测试代码
我想应该是这样的:
fun totalDailySales(orders: List<Order>) : Map<DayOfWeek, Int> =
orders.groupBy { it.creationDate.dayOfWeek }
.mapValues { it.value.flatMap { it.orderLines } }
.mapValues { it.value.map { it.quantity } }
.mapValues { it.value.sum() }
这将导致输出:
{FRIDAY=15}
下面是提供的的的修改版本,带有一些测试代码 更新了评论后的答案--现在计算按星期几分组的所有订单项数量:
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))
}
通过这种方法,Kotlin函数为您进行分组和计数。groupBy函数创建从DayOfWeek到订单列表的映射(将列表中具有同一周中同一天的所有订单分组)。mapValues函数通过将列表替换为SumItemQuantilities函数的结果(针对每个列表)来转换该映射
在代码中的for循环中,可以检索特定日期的当前数量(如果尚未设置,则使用零),将其增加适当的数量,然后存储。要仅返回具有非零值的映射项,您可以进行筛选(返回totalsPerDay.filter{it.value>0})或从空映射开始。这是您的函数,有一些更改:
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
}
谢谢你的帮助。但是,您的解决方案并没有给出正确的答案。它计算每天被提及的次数,想要得到的结果是计算当天的总数量。@Alonhlider你是指所有订单行数量的总和吗?@Arjan是的,这就是我想要的mean@AlonShlider不客气。我也更新了我的答案。很好的共同努力…:-)
{FRIDAY=28, SATURDAY=6}
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}