Dictionary 正在更新Kotlin中特定密钥的映射值

Dictionary 正在更新Kotlin中特定密钥的映射值,dictionary,kotlin,Dictionary,Kotlin,我是科特林的新手,正在努力学习这门语言 我有一个函数,它返回DayofWeek作为键,返回Int作为值 我面临的问题是,我需要获取一个对象列表,该列表中有另一个对象列表,该列表中有一个Int值,每次看到相同的值时,我都需要保存并递增该值 这是我的职责- class OrdersAnalyzer { data class Order(val orderId: Int, val creationDate: LocalDateTime, val orderLines: List<Orde

我是科特林的新手,正在努力学习这门语言

我有一个函数,它返回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!!
    }

}
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}