Kotlin:如何将列表转换为带列表的地图?

时间:2017-11-01 00:01:24

标签: kotlin

我有一个列表如下 {(" a",1),(" b",2),(" c",3),(" a", 4)}

我想将其转换为列表地图,如下所示 {(" a"(1,4)),(" b",(2)),(" c",(3)))}

即。对于a,我们有一个1和4的列表,因为键是相同的。

答案 How to convert List to Map in Kotlin?仅显示唯一值(而不是像我一样的重复值)。

我在Kotlin中试过associateBy

    data class Combine(val alpha: String, val num: Int)
    val list = arrayListOf(Combine("a", 1), Combine("b", 2), Combine("c", 3), Combine("a", 4))
    val mapOfList = list.associateBy ( {it.alpha}, {it.num} )
    println(mapOfList)

但似乎没有用。我怎么能在Kotlin做到这一点?

2 个答案:

答案 0 :(得分:11)

代码

fun main(args: Array<String>) {
    data class Combine(val alpha: String, val num: Int)
    val list = arrayListOf(Combine("a", 1), Combine("b", 2), Combine("c", 3), Combine("a", 4))
    val mapOfList = list.associateBy ( {it.alpha}, {it.num} )
    println(mapOfList)
    val changed = list
        .groupBy ({ it.alpha }, {it.num})
    println(changed)
}

输出

{a=4, b=2, c=3}
{a=[1, 4], b=[2], c=[3]}

工作原理

  • 首先是列表
  • 它将Combine s的alpha值分组为num

答案 1 :(得分:5)

您可以先按alpha对列表进行分组,然后将值映射到List<Int>

data class Combine(val alpha: String, val num: Int)
val list = arrayListOf(Combine("a", 1), Combine("b", 2), Combine("c", 3), Combine("a", 4))
val mapOfList = list
        .groupBy { it.alpha }
        .mapValues { it.value.map { it.num } }
println(mapOfList)