如何使用Kotlin将贷款集合转换为净贷款人集合?
想象以下几对:如何使用Kotlin将贷款集合转换为净贷款人集合?,kotlin,group-by,Kotlin,Group By,想象以下几对: T1, T2 -> 100 T1, T2 -> 30 T2, T1 -> 50 T3, T1 -> 400 第一个位置表示贷方,第二个位置表示借方,箭头后的数字为金额 我需要的最终输出是这样的: T1, T2 -> 80 T3, T1 -> 400 这告诉我什么是净贷款人(第一位)。我如何在科特林实现这一目标 我知道如何获得中间产品: T1, T2 -> 130 T2, T1 -> 50 T3, T1 -> 400 使用
T1, T2 -> 100
T1, T2 -> 30
T2, T1 -> 50
T3, T1 -> 400
第一个位置表示贷方,第二个位置表示借方,箭头后的数字为金额
我需要的最终输出是这样的:
T1, T2 -> 80
T3, T1 -> 400
这告诉我什么是净贷款人(第一位)。我如何在科特林实现这一目标
我知道如何获得中间产品:
T1, T2 -> 130
T2, T1 -> 50
T3, T1 -> 400
使用groupBy相当容易,但我不知道如何以优雅的方式将其转换为所需的输出。我提出了这段代码,似乎实现了它
fun main() {
val loans = listOf(
(("T1" to "T2") to 100),
(("T1" to "T2") to 30),
(("T2" to "T1") to 50),
(("T3" to "T1") to 400),
(("T1" to "T3") to 400)
)
val result = loans
.groupBy { (pair, amount) ->
linkedSetOf(pair.component1(), pair.component2())
}
.map { (k, v) ->
k to v.map { (k2, v2) -> if (k.elementAt(0) == k2.component1()) k2 to v2 else k2 to -v2 }
}
.map { (k, v) ->
k to v.map { (_, amount) -> amount }.sum()
}.map { (k , v) ->
if (v >= 0) k.elementAt(0) to k.elementAt(1) to v
else k.elementAt(1) to k.elementAt(0) to -v
}
print(result)
}
为了澄清,输出的第二个位置的项目是什么意思?箭头前的第一个位置是贷方,第二个位置是借方。箭头后面的数字是借出的金额。我刚才的一个想法是在输出中始终有T1,T2。如果T1是贷方净额,则最终金额为正,否则为负。对,但在您的示例中,最终输出T2缺失,所以它是特定贷方欠特定借方的所有款项的最终集合吗?如果您已经做了一些中间工作,这将是很好的张贴它是你的代码工作,它符合预期的喜好。那么你还想要什么?