2017-03-06 512 views
2

我想用特定的键值对添加/设置可变映射的元素。 到目前为止,我想通了,我可以用加运营商对数据类型以及增加新的元素:Kotlin基础知识:如何添加或设置Map的元素?

var arr3:Map<Any, Any> = mutableMapOf() 
arr3 += Pair("manufacturer", "Weyland-Yutani") 
//also, the "to" operator works too: 
//arr3 += ("manufacturer" to "Weyland-Yutani") 

但是,我找不到如何修改或添加新键值对:

arr3["manufacturer"] = "Seegson" // gives an error(Kotlin: No set method providing array access) 
arr3["manufacturer"] to "Seegson" // compiles, but nothing is added to the array 

请您详细说明我该怎么做?

回答

7

您声明可变arr3明确类型Map<Any, Any>Map)接口不允许突变。 +=运算符创建映射的新实例并变量变量arr3。要修改地图的内容,申报arr3MutableMap像这样:

var arr3:MutableMap<Any, Any> = mutableMapOf() 

或更地道

var arr = mutableMapOf<Any, Any>() 

注意,通常你需要或者可变变量var或可变实例类型MutableMap但是从我的经验很少都。

换句话说,你可以使用可变变量与不变类型:

var arr = mapOf<Any,Any>() 

,并使用+=操作员修改其中arr点。

或者你可以使用MutableMap与不变arr变量和修改,其中arr点内容:

val arr = mutableMapOf<Any,Any>() 

很明显,你只能修改MutableMap内容。因此arr["manufacturer"] = "Seegson"只能用于声明的变量。

+0

**“+ =运算符创建一个map的新实例并改变变量arr3”**当它,这种行为欺骗了我(错误的类型是我的错)。感谢您的详细解答! –

3

关于添加/设置操作,这些都可以被执行MutableMap<K, V>(不只是Map<K, V>),并可以通过多种方式来完成:

  • 的Java风格put电话:

    arr3.put("manufacturer", "Seegson") 
    

    该调用返回以前与该关键字相关的值,或null

  • 更惯用科特林呼叫使用set operator

    arr["matufacturer"] = "Seegson" 
    
  • plusAssign运算符的语法:

    arr += "manufacturer" to "Seegson" 
    

    该选项引入了呼叫之前创建的Pair的开销,是因为较少的可读它可能会与var重新分配相混淆(另外,由于含糊不清,它不适用于var),但仍然是当您已经有想要添加的Pair时很有用。