英文:
Kotlin : Groupby the objects by 2 values, perform sum and then map it to other object
问题
不需要翻译的代码部分:
i am not very expert in kotlin collection functions so need some help:
Assume i have a data class:
data class transaction(val SenderName: String,val ReceiverName: String,val Amount: Int)
the list of transactions
val transactions = listOf(
transaction("Rahul","Ravi",10000),
transaction("Rahul","Ravi",-500),
transaction("Ravi","Rahul",1000))
First i want to group the entries based on the sender & receiver followed by adding the amounts. which i am able to do using the below code
transactions.groupBy { it.SenderName to it.ReceiverName}.map{entity ->
val amountSum = entity.value.sumOf { it.Amount }}
after this what i want is to calculate the final amount of transactions between 2 persons from one person's reference. Like for example i calculate for Rahul's point of view then:
Sum of amount(where Rahul is Sender) - Sum of amount (where rahul is receiver)
which will be: 9500 - 1000 = 8500
and the final output should be:
data class NewObject(val reference_person:String, val Other_person :String, val FinalAmount:Int)
val finalList = [("Rahul","Ravi",8500),("Ravi","Rahul",-8500)]
I have gone throught many stackoverflow posts but don't know how to achieve this. Thanks
以下是翻译好的部分:
我对 Kotlin 集合函数不是很擅长,所以需要一些帮助:
假设我有一个数据类:
data class Transaction(val senderName: String, val receiverName: String, val amount: Int)
交易列表如下:
val transactions = listOf(
Transaction("Rahul", "Ravi", 10000),
Transaction("Rahul", "Ravi", -500),
Transaction("Ravi", "Rahul", 1000)
)
首先,我想根据发送者和接收者对条目进行分组,然后添加金额。我可以使用以下代码来实现:
transactions.groupBy { it.senderName to it.receiverName }.map { entity ->
val amountSum = entity.value.sumOf { it.amount }
}
在此之后,我想要计算两个人之间的交易的最终金额,从一个人的角度出发。例如,如果我从 Rahul 的角度计算:
Rahul 作为发送者的金额总和 - Rahul 作为接收者的金额总和
这将是:9500 - 1000 = 8500
最终的输出应该如下所示:
data class NewObject(val referencePerson: String, val otherPerson: String, val finalAmount: Int)
val finalList = listOf(
NewObject("Rahul", "Ravi", 8500),
NewObject("Ravi", "Rahul", -8500)
)
我查阅了很多 Stack Overflow 帖子,但不知道如何实现这一目标。谢谢。
英文:
i am not very expert in kotlin collection functions so need some help:
Assume i have a data class:
data class transaction(val SenderName: String,val ReceiverName: String,val Amount: Int)
the list of transactions
val transactions = listOf(
transaction("Rahul","Ravi",10000),
transaction("Rahul","Ravi",-500),
transaction("Ravi","Rahul",1000))
First i want to group the entries based on the sender & receiver followed by adding the amounts. which i am able to do using the below code
transactions.groupBy { it.SenderName to it.ReceiverName}.map{entity ->
val amountSum = entity.value.sumOf { it.Amount }}
after this what i want is to calculate the final amount of transactions between 2 persons from one person's reference. Like for example i calculate for Rahul's point of view then:
Sum of amount(where Rahul is Sender) - Sum of amount (where rahul is receiver)
which will be: 9500 - 1000 = 8500
and the final output should be:
data class NewObject(val reference_person:String, val Other_person :String, val FinalAmount:Int)
val finalList = [("Rahul","Ravi",8500),("Ravi","Rahul",-8500)]
I have gone throught many stackoverflow posts but don't know how to achieve this. Thanks
答案1
得分: 1
你可以尝试这样做:
val finalList = (transactions + transactions.map {
transaction(
it.ReceiverName,
it.SenderName,
-1 * it.Amount
)
}).groupBy { it.SenderName to it.ReceiverName }.map { entity ->
NewObject(entity.key.first, entity.key.second, entity.value.sumOf { it.Amount })
}
println(finalList)
//[NewObject(reference_person=Rahul, Other_person=Ravi, FinalAmount=8500), NewObject(reference_person=Ravi, Other_person=Rahul, FinalAmount=-8500)]
我首先将原始列表与具有发送者和接收者颠倒的相同列表相加。然后按照你的方式将它们分组,最后映射到 NewObject
。
英文:
You can try this
val finalList = (transactions + transactions.map {
transaction(
it.ReceiverName,
it.SenderName,
-1 * it.Amount
)
}).groupBy { it.SenderName to it.ReceiverName }.map { entity ->
NewObject(entity.key.first, entity.key.second, entity.value.sumOf { it.Amount })
}
println(finalList)
//[NewObject(reference_person=Rahul, Other_person=Ravi, FinalAmount=8500), NewObject(reference_person=Ravi, Other_person=Rahul, FinalAmount=-8500)]
What I first do is add to the original list the same list but with sender and receiver reversed. Then I group them like you did, and finally mapped them to NewObject
s
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论