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)