Kotlin集合操作:按双向交易计算个人间最终金额
Kotlin集合处理:计算用户间最终交易余额
解决方案代码
先修正数据类命名以符合Kotlin规范,再实现需求逻辑:
// 修正类名大驼峰(Kotlin编码规范) data class Transaction(val SenderName: String, val ReceiverName: String, val Amount: Int) data class NewObject(val reference_person: String, val Other_person: String, val FinalAmount: Int) val transactions = listOf( Transaction("Rahul","Ravi",10000), Transaction("Rahul","Ravi",-500), Transaction("Ravi","Rahul",1000) ) fun main() { // 1. 预处理:获取每对(发送方-接收方)的总交易金额 val pairTotal = transactions.groupBy { it.SenderName to it.ReceiverName } .mapValues { (_, txList) -> txList.sumOf { it.Amount } } // 2. 获取所有参与交易的唯一用户 val allUsers = transactions.flatMap { listOf(it.SenderName, it.ReceiverName) }.distinct() // 3. 生成最终结果列表 val finalList = allUsers.flatMap { referenceUser -> allUsers.filter { it != referenceUser }.map { otherUser -> // 计算参考用户相对于对方的最终金额:发送给对方的总和 - 收到对方的总和 val sent = pairTotal[referenceUser to otherUser] ?: 0 val received = pairTotal[otherUser to referenceUser] ?: 0 NewObject(referenceUser, otherUser, sent - received) } } // 验证输出 finalList.forEach { println(it) } }
逻辑说明
- 预处理交易对总和:用
groupBy按「发送方-接收方」分组,再通过mapValues计算每组的金额总和,得到一个可快速查询的单向交易总额映射表。 - 收集所有用户:通过
flatMap收集所有交易涉及的发送方和接收方,再用distinct去重,确保覆盖所有参与交易的用户。 - 生成最终结果:遍历每个用户作为参考视角,再遍历其他交易对手,计算参考方的最终余额(自己发给对方的总额减去对方发给自己的总额),最后封装成
NewObject组成结果列表。
运行结果
执行代码后将输出:
NewObject(reference_person=Rahul, Other_person=Ravi, FinalAmount=8500) NewObject(reference_person=Ravi, Other_person=Rahul, FinalAmount=-8500)
内容的提问来源于stack exchange,提问作者Ravi.Dudi
相关产品推荐
相关产品推荐

