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

哈米德·加塞米

我有一个对象列表A(alist)。

A { 
  val b : Int
  val c1 : Int
  val c2 : Int
  val d1 : Int
  val d2 : Int
}

我想通过它们分组b和计算总和c1+c2,并d1+d2在每个组,并把结果列表中的电子对象elist

E {
  val sum_of_c_types : Int
  val sum_of_d_types : Int
}

如何使用任何集合内置函数在kotlin中实现?

注意:

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

s1m0nw1

我用的序列解决了它groupBymapsumBy我猜这可能不是最干净的解决方案。

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

结果是:

Group b=1: E(sumC=10, sumD=18)
Group b=2: E(sumC=4, sumD=4)
Group b=3: E(sumC=3, sumD=3)

编辑

使用Grouping(使用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)
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章