如何在 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)
}
}

当我们在它,我想如何添加,删除,并得到一个从地图条目的一些例子。

118741 次浏览

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

您感到困惑的原因是,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)
}
}

你必须用

放下

方法。

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"
}
}
val params: MutableMap<String, String> = HashMap<String, String>()
params.put("1", "A")
params.put("2", "B")