web-dev-qa-db-fra.com

Comment travailler avec des cartes dans Kotlin

Le code ci-dessous crée une nouvelle carte appelée nameTable, puis y ajoute une entrée nommée exemple, puis tente d'imprimer la propriété name de la valeur.

Lorsque je l'exécute, il semble que l'opération plus n'a pas ajouté une nouvelle entrée à la carte comme je le pensais.

Alors qu'est-ce que je fais mal? 

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

Pendant que nous y sommes, j'aimerais avoir des exemples sur la façon d’ajouter, de supprimer et d’obtenir une entrée d’une carte.

31
Dina Kleper

La raison de votre confusion est que plus est non un opérateur en mutation, ce qui signifie qu'il fonctionne sur (en lecture seule) Map, mais ne modifie pas l’instance elle-même. C'est la signature:

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

Ce que vous voulez, c'est un opérateur mutant set, défini sur MutableMap:

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

Donc, votre code peut être réécrit (avec quelques améliorations supplémentaires):

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

La méthode plus sur Map crée une nouvelle carte contenant la nouvelle entrée. Cela ne modifie pas la carte d'origine. Si vous souhaitez utiliser cette méthode, vous devez procéder comme suit:

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

Si vous souhaitez ajouter l'entrée à la carte d'origine, vous devez utiliser la méthode put comme en Java.

Cela fonctionnerait:

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

Pour obtenir et supprimer des entrées de la MutableMap, vous pouvez utiliser ceci:

nameTable["person1"] // Syntactic sugar for nameTable.get("person1")
nameTable.remove("person1")
7
marstran

C'est trop compliqué , Vous pouvez attribuer directement des valeurs , comme ceci:

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

Vous devez utiliser 

mettre

méthode.

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
Zahangir Alam