如何使用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缺失,所以它是特定贷方欠特定借方的所有款项的最终集合吗?如果您已经做了一些中间工作,这将是很好的张贴它是你的代码工作,它符合预期的喜好。那么你还想要什么?