如何在 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 和 Firebase :根据点击的地图标记在底部工作表中显示不同的数据
在 kotlin 中的 requestLocationUpdates 之后移动标记而不是添加它