树:向下递归,向上汇总

工作代码如下

fun List<MeasureLedgerModel>.sumUp(): List<MeasureLedgerModel> {

        val pMap = this.filter { it.parentId != null }.groupBy { it.parentId!! }
        //获取顶层节点
        val top = this.filter { it.parentId == null }
        //向下遍历
        fun  calculateChildren(node:MeasureLedgerModel):MeasureLedgerModel{

            val childs = pMap[node.id]

            if(childs.isNullOrEmpty()) return node

            var launchQuantity = node.launchQuantity.orZero()
            var listEditQuantity = node.listEditQuantity.orZero()
            var listEditAmount = node.listEditAmount.orZero()
            var periodAmounts = node.periodAmounts


            childs.forEach {
                val childs = calculateChildren(it)
                launchQuantity += childs.launchQuantity.orZero()
                listEditQuantity += childs.listEditQuantity.orZero()
                listEditAmount += childs.listEditAmount.orZero()
                childs.periodAmounts.forEachIndexed { index, value ->
                    periodAmounts[index] = periodAmounts[index].orZero().plus(value.orZero())
                }
            }
            node.launchQuantity = launchQuantity
            node.listEditQuantity = listEditQuantity
            node.listEditAmount = listEditAmount
            node.periodAmounts = periodAmounts
            return node
        }

        top.forEach {
            calculateChildren(it)
        }
        return this
    }

posted @   Acaak  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示