2016-05-26 15 views
14

Der folgende Code erstellt eine neue Map mit dem Namen nameTable, fügt dann einen Eintrag namens named hinzu und versucht dann, die name-Eigenschaft des Value zu drucken.So arbeiten Sie mit Maps in Kotlin

Wenn ich es ausführe, scheint es, dass der Plus-Vorgang der Karte keinen neuen Eintrag hinzufügte, wie ich dachte.

Also, was mache ich falsch?

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

Während wir gerade dabei sind, würde ich einige Beispiele von Liebe, wie man hinzufügen, entfernen und einen Eintrag aus einer Karte bekommen.

Antwort

5

Die Plus-Methode auf Map erstellt eine neue Karte, die den neuen Eintrag enthält. Es mutiert nicht die ursprüngliche Karte. Wenn Sie diese Methode verwenden möchten, müssen Sie dies tun:

fun main (args: Array<String>){ 
    val table = nameTable.plus(Pair("person1", example)) 
    for (entry in table) { 
     println(entry.value.age) 
    } 
} 

Wenn Sie den Eintrag in die ursprüngliche Karte hinzufügen möchten, müssen Sie die put Methode wie in Java verwenden.

Dies funktionieren würde:

fun main (args: Array<String>){ 
    nameTable.put("person1", example) 
    for (entry in nameTable) { 
     println(entry.value.age) 
    } 
} 

Einträge zu umgehen und entfernen MutableMap, können Sie diese verwenden:

nameTable["person1"] // Syntactic sugar for nameTable.get("person1") 
nameTable.remove("person1") 
+0

By the way, weiß jemand, warum gibt es kein 'Operator Spaß minus (Schlüssel: K)' Methode auf Kotlin Karten? – marstran

21

Der Grund für die Verwirrung ist, dass plus ist nicht ein mutierenden Operator, was bedeutet, dass es funktioniert (schreibgeschützt) Map, aber ändert nicht die Instanz selbst. Dies ist die Unterschrift:

operator fun <K, V> Map<out K, V>.plus(pair: Pair<K, V>): Map<K, V> 

Was Sie wollen, ist ein mutierenden Operator set, definiert auf MutableMap:

operator fun <K, V> MutableMap<K, V>.set(key: K, value: V) 

So kann Ihr Code (mit einigen zusätzlichen Erweiterungen) neu geschrieben werden:

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

'+ =' wird auch funktionieren. –

1

Sie müssen

verwenden

setzen

Methode.

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

Es ist zu viel Mühe, können Sie Werte direkt zuweisen, wie folgt aus:

@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" 
    } 
} 
Verwandte Themen