如何在Kotlin中对分组后的多个元素求和

如何在Kotlin中对分组后的多个元素求和,kotlin,Kotlin,我有一个对象列表(alist) 我想按b对它们进行分组,计算每组c1+c2和d1+d2的总和,并将结果放入E对象列表elist A { val b : Int val c1 : Int val c2 : Int val d1 : Int val d2 : Int } E { val sum_of_c_types : Int val sum_of_d_types : Int } 如何在kotlin中使用任何集合内置函数实现 注: 我知道我可以使用reduce函数创

我有一个对象列表(
alist

我想按
b
对它们进行分组,计算每组
c1+c2
d1+d2
的总和,并将结果放入E对象列表
elist

A { 
  val b : Int
  val c1 : Int
  val c2 : Int
  val d1 : Int
  val d2 : Int
}
E {
  val sum_of_c_types : Int
  val sum_of_d_types : Int
}
如何在kotlin中使用任何集合内置函数实现

注:


我知道我可以使用
reduce
函数创建临时A对象,但在代码中不要使用临时A对象很重要。

我通过以下代码解决了这个问题:

alist.groupby { b }. mapValues {
   it.value.map {
      E(it.c1+it.c2, it.d1+it.d2)
   }.reduce { 
      acc, e -> E(acc.sum_of_c_types + e.sum_of_c_types, acc.sum_of_d_types + e.sum_of_d_types)
   }.values

我通过使用
groupBy
map
sumBy
序列解决了这个问题。我想这可能不是最干净的解决办法

data class A(val b: Int,
             val c1: Int,
             val c2: Int,
             val d1: Int,
             val d2: Int)

data class E(val sumC: Int, val sumD: Int)

fun main(args: Array<String>) {
    val alist = listOf(A(1, 2, 1, 4, 5), A(1, 3, 4, 6, 3), A(2, 2, 2, 2, 2), A(3, 1, 2, 1, 2))
    val grouped: Map<Int, E> = alist.groupBy(A::b).mapValues {
        E(it.value.sumBy { it.c1 + it.c2 }, it.value.sumBy { it.d1 + it.d2 })
    }
    grouped.forEach {
        println("Group b=${it.key}: ${it.value}")
    }
}
编辑

使用
分组
(使用
groupingBy
而不是
groupBy
),效果会更好,因为您不必处理地图实体:

 val grouped = alist.groupingBy(A::b).aggregate { _, acc: E?, e, _ ->
        E((acc?.sumC ?: 0) + e.c1 + e.c2, (acc?.sumD ?: 0) + e.d1 + e.d2)
    }

我认为这只是分组与折叠

fun group(a: List<A>) = a.groupingBy(A::b).fold(E(0, 0),
        { acc, elem ->
            E(acc.sum_of_c_types + elem.c1 + elem.c2,
                    acc.sum_of_d_types + elem.d1 + elem.d2)
        })
fun group(a:List)=a.groupingBy(a::b).fold(E(0,0),
{acc,elem->
E(根据c类+要素c1+要素c2的总和,
附件d类型之和+要素d1+要素d2)
})

为什么不使用.map?我是kotlin的新手,无法在
alist
map函数中创建E对象。我不知道这是否可能:-/假设您有一个E构造函数。你可以使用:
val-elist=alist.map{E(it.c1+it.c2,it.d1+it.d2)
谢谢你,我想你的提示找到了答案:)
fun group(a: List<A>) = a.groupingBy(A::b).fold(E(0, 0),
        { acc, elem ->
            E(acc.sum_of_c_types + elem.c1 + elem.c2,
                    acc.sum_of_d_types + elem.d1 + elem.d2)
        })