Question or issue of Kotlin Programming:
The code below is creating a new map called nameTable, then adding an entry named example to it, then trying to print the name property of the Value.
When I run it, it seems that the plus operation didn’t add a new entry to the map like I thought it would.
So what am I doing wrong?
class Person(name1: String, lastName1: String, age1: Int){ var name: String = name1 var lastName: String = lastName1 var age: Int = age1 } var nameTable: MutableMap = mutableMapOf() var example = Person("Josh", "Cohen", 24) fun main (args: Array){ nameTable.plus(Pair("person1", example)) for(entry in nameTable){ println(entry.value.age) } }
While we’re at it, I would love some examples of how to add, remove, and get an entry from a map.
How to solve this issue?
Solution no. 1:
The reason for your confusion is that plus
is not a mutating operator, meaning that it works on (read-only) Map
, but does not change the instance itself. This is the signature:
operator fun Map.plus(pair: Pair): Map
What you want is a mutating operator set
, defined on MutableMap
:
operator fun MutableMap.set(key: K, value: V)
So your code may be rewritten (with some additional enhancements):
class Person(var name: String, var lastName: String, var age: Int) val nameTable = mutableMapOf() val example = Person("Josh", "Cohen", 24) fun main (args: Array) { nameTable["person1"] = example for((key, value) in nameTable){ println(value.age) } }
Solution no. 2:
The plus-method on Map
creates a new map that contains the new entry. It does not mutate the original map. If you want to use this method, you would need to do this:
fun main() { val table = nameTable.plus(Pair("person1", example)) for (entry in table) { println(entry.value.age) } }
If you want to add the entry to the original map, you need to use the put
method like in Java.
This would work:
fun main() { nameTable.put("person1", example) for (entry in nameTable) { println(entry.value.age) } }
To get and remove entries from the MutableMap
, you can use this:
nameTable["person1"] // Syntactic sugar for nameTable.get("person1") nameTable.remove("person1")
Solution no. 3:
It’s too much trouble,You can assign values directly,like this:
@Test @Throws(Exception::class) fun main(){ val map:MutableMap = 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" } }
Solution no. 4:
You have to use
put
method.
class Person(name1:String, lastName1:String, age1:Int){ var name:String = name1 var lastName:String = lastName1 var age:Int = age1 } var nameTable:MutableMap = mutableMapOf() var example = Person("Josh", "Cohen", 24) fun main (args: Array){ nameTable.put("person1", example) for(entry in nameTable){ println(entry.value.age) } }