如何在 Kotlin 中使用地图

Posted

技术标签:

【中文标题】如何在 Kotlin 中使用地图【英文标题】:How to work with Maps in Kotlin 【发布时间】:2016-09-24 16:24:31 【问题描述】:

下面的代码正在创建一个名为nameTable 的新映射,然后向其中添加一个名为 example 的条目,然后尝试打印 Value 的 name 属性。

当我运行它时,似乎加号操作并没有像我想象的那样向地图添加新条目。

那我做错了什么?

class Person(name1: String, lastName1: String, age1: Int)
    var name: String = name1
    var lastName: String = lastName1
    var age: Int = age1


var nameTable: MutableMap<String, Person> = mutableMapOf()
var example = Person("Josh", "Cohen", 24)

fun main (args: Array<String>)
    nameTable.plus(Pair("person1", example))
    for(entry in nameTable)
        println(entry.value.age)
    

虽然我们在做这件事,但我希望有一些示例来说明如何从地图中添加、删除和获取条目。

【问题讨论】:

【参考方案1】:

您感到困惑的原因是plus 不是 变异运算符,这意味着它适用于(只读)Map,但不会更改实例本身。这是签名:

operator fun <K, V> Map<out K, V>.plus(pair: Pair<K, V>): Map<K, V>

你想要的是一个变异运算符set,定义在MutableMap

operator fun <K, V> MutableMap<K, V>.set(key: K, value: V)

因此您的代码可能会被重写(带有一些额外的增强功能):

class Person(var name: String, var lastName: String, var age: Int)

val nameTable = mutableMapOf<String, Person>()
val example = Person("Josh", "Cohen", 24)

fun main (args: Array<String>) 
    nameTable["person1"] = example

    for((key, value) in nameTable)
        println(value.age)
    

【讨论】:

【参考方案2】:

Map 上的 plus 方法会创建一个包含新条目的新映射。它不会改变原始地图。如果你想使用这个方法,你需要这样做:

fun main() 
    val table = nameTable.plus(Pair("person1", example))
    for (entry in table) 
        println(entry.value.age)
    

如果要在原始地图中添加条目,则需要像 Java 中那样使用put 方法。

这可行:

fun main() 
    nameTable.put("person1", example)
    for (entry in nameTable) 
        println(entry.value.age)
   
 

要从MutableMap 中获取和删除条目,您可以使用:

nameTable["person1"] // Syntactic sugar for nameTable.get("person1")
nameTable.remove("person1")

【讨论】:

对了,有谁知道为什么 Kotlin 地图上没有 operator fun minus(key: K) 方法? 在 v1.1 中添加了减号运算符kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/…【参考方案3】:

太麻烦了,可以直接赋值,像这样:

@Test
@Throws(Exception::class)
fun main()

    val map:MutableMap<String,Person> = mutableMapOf()

    map["Josh"]= Person("Josh", "Cohen", 24)

    map.forEach  t, u ->
        println("map key:$t,map value:$u.toString()")
    


class Person(name1:String, lastName1:String, age1:Int)
    var name:String = name1
    var lastName:String = lastName1
    var age:Int = age1

    override fun toString(): String 
        return "name:$name,lastNam:$lastName,age:$age \n"
    

【讨论】:

【参考方案4】:

你必须使用

方法。

class Person(name1:String, lastName1:String, age1:Int)
    var name:String = name1
    var lastName:String = lastName1
    var age:Int = age1

var nameTable:MutableMap<String, Person> = mutableMapOf()
var example = Person("Josh", "Cohen", 24)
fun main (args: Array<String>)
    nameTable.put("person1", example)
    for(entry in nameTable)
        println(entry.value.age)
    

【讨论】:

以上是关于如何在 Kotlin 中使用地图的主要内容,如果未能解决你的问题,请参考以下文章

使用地图片段(kotlin)时,活动在充气时崩溃

Kotlin 和 Firebase :根据点击的地图标记在底部工作表中显示不同的数据

在 kotlin 中的 requestLocationUpdates 之后移动标记而不是添加它

如何从 kotlin 中的 firestore 读取映射数据

如何在 kotlin 中使用片段

如何在 Kotlin 中使用 ViewModelProviders