如何在Kotlin中使用地图

79
下面的代码创建了一个名为nameTable 的新映射,然后向其中添加了一个名为"example"的条目,然后尝试打印该值的名称属性。
当我运行它时,似乎加法操作没有像我想的那样向映射中添加新条目。
所以我做错了什么?
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)
    }
}

顺便提一句,我希望能够得到如何向地图中添加、删除和获取条目的示例。

5个回答

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

20

Mapplus 方法会创建一个包含新条目的新映射。它不会改变原始映射。如果您想使用此方法,您需要执行以下操作:

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) 方法吗? - marstran
在v1.1版本中,添加了减号运算符。 https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/minus.html - Bishoy Kamel

10

这太麻烦了,你可以直接指定数值,就像这样:

@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

您需要使用

put

方法。

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

0
val params: MutableMap<String, String> = HashMap<String, String>()
    params.put("1", "A")
    params.put("2", "B")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接