如果不存在密钥,如何使用默认值制作地图?

时间:2019-04-10 09:05:31

标签: arrays dictionary kotlin

我想构建一个解析对象列表的数组映射。 当已经添加了该映射的索引时,我需要添加之前未添加的数组元素,否则需要在Map中创建新元素。

假设我们有一个csv,其中包含这样的数据

names,nicknames
Tom,tommy;timmy
Sam,sammy
Tom,timmy;mymen

我想要一张这样的地图:

Map["Tom"] = ["tommy", "timmy", "mymen"]
Map["Sam"] = ["sammy"]

我很惊讶没有此功能

什么在起作用,但应该加以改进? (我要解析40万行CSV)

    val myObjectList: List<myObject> = beans.parse() /* importing POJOs from csv*/
    val myMap: MutableMap<String,List<String>> = mutableMapOf()

    myObjectList.forEach { entry ->
       if ( myMap[entry.name].isNullOrEmpty()) {
           myMap[entry.name] = entry.nicknames.split(";")
       } else {
           myMap[entry.name]!!.plus(entry.nicknames.split(";"))
       }
    }


    return myMap

1 个答案:

答案 0 :(得分:1)

使用getOrPut,例如:

data class MyObject(
        val name: String,
        val nicknames: String
)

fun main() {
    val myObjectList = listOf(
            MyObject("primary", "secondary1;secondary2"),
            MyObject("primary", "secondary3")
    )
    val nameToNicks = mutableMapOf<String, MutableList<String>>()

    myObjectList.forEach { myObj ->
        nameToNicks.getOrPut(myObj.name, {mutableListOf()}) .addAll(myObj.nicknames.split(";"))
    }

    print(nameToNicks)
}