Kotlin如何在数据类列表中集成/合并相同值

lea*_*f76 0 collections list arraylist kotlin

我想将相同的“开始时间”合并到列表中的一个(步数、距离和卡路里),我该如何做到这一点。

 var listNewStepData = arrayListOf<NewStepData>()
Run Code Online (Sandbox Code Playgroud)

数据类

data class NewStepData (
    val startTime: String?,
    val endTime: String?,
    val step: Int? = 0,
    val distance: Int? = 0,
    val calorie: Int? = 0
)
Run Code Online (Sandbox Code Playgroud)

这是样本

NewStepData(startTime=2020-04-14T00:00:00.000Z, endTime=2020-04-14T00:00:00.000Z, step=4433, distance=0, calorie=0)
NewStepData(startTime=2020-04-14T00:00:00.000Z, endTime=2020-04-15T00:00:00.000Z, step=0, distance=0, calorie=1697)
NewStepData(startTime=2020-04-14T00:00:00.000Z, endTime=2020-04-14T00:00:00.000Z, step=0, distance=2436, calorie=0)
NewStepData(startTime=2020-04-15T00:00:00.000Z, endTime=2020-04-15T00:00:00.000Z, step=5423, distance=0, calorie=0)
NewStepData(startTime=2020-04-15T00:00:00.000Z, endTime=2020-04-16T00:00:00.000Z, step=0, distance=0, calorie=1715)
NewStepData(startTime=2020-04-15T00:00:00.000Z, endTime=2020-04-15T00:00:00.000Z, step=0, distance=3196, calorie=0)
Run Code Online (Sandbox Code Playgroud)

我想得到这个

NewStepData(startTime=2020-04-14T00:00:00.000Z, endTime=2020-04-15T00:00:00.000Z, step=4433, distance=2436, calorie=1697)
NewStepData(startTime=2020-04-15T00:00:00.000Z, endTime=2020-04-16T00:00:00.000Z, step=5423, distance=3196, calorie=1715)
Run Code Online (Sandbox Code Playgroud)

谢谢

小智 5

您可以用于groupBy { }您的列表。它将返回分组变量类型到原始类型列表的映射。然后,用于flatMap聚合您的数据。

我假设您采用最大结束日期maxBy,即距离和所需的步数sumBy以及卡路里,这sumByDouble是最佳选择。

这是示例代码:

var grouped = listNewStepData.groupBy { it.startTime }.flatMap { entry -> NewStepData(startTime = entry.key,
        endTime = entry.value.maxBy { item -> item.endTime },
        step = entry.value.sumBy { item -> item.step },
        distance = entry.value.sumBy { item -> item.distance },
        calorie = entry.value.sumByDouble { item -> item.calorie })
}
Run Code Online (Sandbox Code Playgroud)