Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to work with Maps in Kotlin

Tags:

maps

kotlin

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

While we're at it, I would love some examples of how to add, remove, and get an entry from a map.

like image 576
Dina Kleper Avatar asked May 26 '16 15:05

Dina Kleper


People also ask

How do maps work in Kotlin?

Kotlin Maps Maps are a common data structure in computer science. They're also known as dictionaries or associative arrays in other programming languages. Maps can store a collection of zero or more key-value pairs. Each key in a map is unique, and it can only be associated with one value.

How do you access map values in Kotlin?

For retrieving a value from a map, you must provide its key as an argument of the get() function. The shorthand [key] syntax is also supported. If the given key is not found, it returns null .


4 Answers

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 <K, V> Map<out K, V>.plus(pair: Pair<K, V>): Map<K, V>

What you want is a mutating operator set, defined on MutableMap:

operator fun <K, V> MutableMap<K, V>.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<String, Person>()
val example = Person("Josh", "Cohen", 24)

fun main (args: Array<String>) {
    nameTable["person1"] = example

    for((key, value) in nameTable){
        println(value.age)
    }
}
like image 53
voddan Avatar answered Oct 26 '22 01:10

voddan


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")
like image 28
marstran Avatar answered Oct 26 '22 02:10

marstran


It's too much trouble,You can assign values directly,like this:

@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"
    }
}
like image 36
amiko Avatar answered Oct 26 '22 02:10

amiko


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<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)
    }
}
like image 23
Zahangir Alam Avatar answered Oct 26 '22 01:10

Zahangir Alam