Kotlin:groupBy并转换为其他对象

Kotlin:groupBy并转换为其他对象,kotlin,Kotlin,我有一张物品清单 data class OldFormat(ShiftId: Int, NozzleValue: Int, NozzleId: Int , UserId: Int) 我想用两个字段“shiftId和userId”来分组,然后从相同组的最小值中减去每个组的最大值,然后 求和结果,然后使用此类将其转换为新对象: data class NewFormat(ShiftId: Int, NozzleValue: Int, UserId: Int) 过程如下: listOfOldForm

我有一张物品清单

data class OldFormat(ShiftId: Int, NozzleValue: Int, NozzleId: Int , UserId: Int)
我想用两个字段“shiftId和userId”来分组,然后从相同组的最小值中减去每个组的最大值,然后 求和结果,然后使用此类将其转换为新对象:

data class NewFormat(ShiftId: Int, NozzleValue: Int, UserId: Int)
过程如下:

listOfOldFormat -> groupby(shiftId, userId) -> sum(maximumValue-minimumValue) -> listOfNewFormat

我们确实有
groupBy
功能,所以我们拥有所需的一切

我不知道你说的
从同一组的最小值中减去每组的最大值,然后对结果求和是什么意思,所以我把它作为
group.value.max-group.value.min
来做,对于
NewFormat
,它是
nozzeValue

代码段:

data class OldFormat(val shiftId: Int, val nozzleValue: Int, val nozzleId: Int, val userId: Int)
data class NewFormat(val shiftId: Int, val nozzleValue: Int, val userId: Int)

fun main() {

    val old = listOf(
            OldFormat(0, 10, 10, 0),
            OldFormat(0, 120, 10, 1),
            OldFormat(1, 11, 8, 10),
            OldFormat(0, 10, 1, 1),
            OldFormat(1, 50, 10, 10)
    ) // Example data

    old.groupBy {
        it.shiftId to it.userId // After it we have Map<Key, List<OldFormat>>, where key is pair of shiftId and userId
    }.map { entry ->
        val max = entry.value.maxBy { it.nozzleValue }?.nozzleValue ?: 0
        val min = entry.value.minBy { it.nozzleValue }?.nozzleValue ?: 0

        entry.key to (max - min) // Just do whatever you want with that data
    }.map {
        NewFormat(
                shiftId = it.first.first,
                userId = it.first.second,
                nozzleValue = it.second
        ) // And now map it into type you want
    }.let {
        println(it) // Just for seeing result
    }
}
数据类OldFormat(val-shiftId:Int,val-nozzleValue:Int,val-nozzleId:Int,val-userId:Int)
数据类NewFormat(val shiftId:Int,val nozzleValue:Int,val userId:Int)
主要内容(){
val old=listOf(
旧格式(0,10,10,0),
旧格式(0,120,10,1),
旧格式(1,11,8,10),
旧格式(0,10,1,1),
旧格式(1,50,10,10)
)//示例数据
老郭比{
it.shiftId to it.userId//在它之后我们有了Map,其中key是shiftId和userId的对
}.map{entry->
val max=entry.value.maxBy{it.nozzleValue}?.nozzleValue?:0
val min=entry.value.minBy{it.nozzleValue}?.nozzleValue?:0
entry.key to(max-min)//只需对该数据执行任何操作
}.地图{
新格式(
shiftId=it.first.first,
userId=it.first.second,
nozzleValue=it.second
)//现在将其映射到所需的类型
}.让{
println(it)//只是为了看结果
}
}

非常感谢,我尝试了你的代码,它在映射到NewFormat之前工作,但是“it”关键字在NewFormat对象中不起作用。我需要在NewFormat对象的nozzleValue中放入(max-min)的和,但是对于一个grup,你只能有一个最小值和一个最大值。我不知道应该加什么。对不起,我指的是(max-min)的和在所有组中,您的示例可简化为
old.groupBy({it.shiftId to it.userId},OldFormat::nozzleValue)。map{(keyPair,values)->NewFormat(keyPair.first,values.max()!!-values.min()!!,keyPair.second)