2016-05-26 11 views
14

Il codice seguente sta creando una nuova mappa chiamata nameTable, quindi aggiungendo una voce con nome di esempio, cercando quindi di stampare la proprietà name del Value.Come lavorare con Maps in Kotlin

Quando lo eseguo, sembra che l'operazione più non aggiunga una nuova voce alla mappa come pensavo.

Quindi cosa sto sbagliando?

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

Già che ci siamo, mi piacerebbe alcuni esempi di come aggiungere, rimuovere e ottenere una voce da una mappa.

risposta

5

Il metodo più su Map crea una nuova mappa che contiene la nuova voce. Non muta la mappa originale. Se si desidera utilizzare questo metodo, si avrebbe bisogno di fare questo:

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

Se si desidera aggiungere la voce alla mappa originale, è necessario utilizzare il metodo put come in Java.

Questo potrebbe funzionare:

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

Per ottenere risultati e rimuovere le voci dal MutableMap, è possibile utilizzare questo:

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

A proposito, qualcuno sa perché non c'è un 'operatore di divertimento meno (chiave: K) metodo' sulle mappe di Kotlin? – marstran

21

La ragione per la confusione è che plus è non un mutante operatore, il che significa che funziona su (sola lettura) Map, ma non modifica l'istanza stessa. Questa è la firma:

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

quello che vuoi è un operatore di mutante set, definita su MutableMap:

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

Così il vostro codice può essere riscritto (con alcuni miglioramenti aggiuntivi):

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

'+ =' funzionerà anche. –

1

È necessario utilizzare

put

metodo.

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

E 'troppo disturbo, è possibile assegnare valori direttamente, in questo modo:

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