如何在Kotlin中使用地图

下面的代码创建一个名为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) } } 

虽然我们在这,但我还是喜欢一些如何添加,删除和从地图获取条目的例子。

造成混淆的原因是, plus 不是一个变异操作符,意味着它在(只读) Map ,但不会更改实例本身。 这是签名:

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

你想要的是在MutableMap定义的变异操作set

 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) } } 

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

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

如果要将条目添加到原始映射中,则需要像使用Java一样使用put方法。

这将工作:

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

要从MutableMap获取和删除条目,可以使用下面的命令:

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

你必须使用

方法。

 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) } } 

这太麻烦了,你可以直接赋值,如下所示:

 @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" } } 
    Interesting Posts