22 votes

Comment travailler avec des Cartes de Kotlin

Le code ci-dessous est la création d'une nouvelle carte appelée nameTable, puis l'ajout d'une entrée nommée exemple, puis essayez d'imprimer le nom de la propriété de la Valeur.

Quand je le lance, il semble que l'opération plus de ne pas ajouter une nouvelle entrée à la carte de ce que je pensais.

Donc, 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 quelques exemples de comment ajouter, supprimer, et obtenir une entrée à partir d'une carte.

25voto

voddan Points 16

La raison de cette confusion est que l' plus est pas une mutation de l'opérateur, ce qui signifie qu'il fonctionne sur (lecture seule) Map, mais ne change 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 une mutation de l'opérateur set, défini sur MutableMap:

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

Ainsi, votre code peut être réécrite (avec quelques améliorations):

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

7voto

marstran Points 9298

Le plus-la méthode d' Map crée une nouvelle carte qui contient la nouvelle entrée. Il n'a pas de mutation de la carte originale. Si vous souhaitez utiliser cette méthode, vous aurez besoin de faire cela:

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 originale, vous avez besoin d'utiliser l' put méthode comme en Java.

Ce serait le travail:

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

D'obtenir et de supprimer des entrées de l' MutableMap, vous pouvez utiliser ceci:

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

1voto

Zahangir Alam Points 11

Vous devez utiliser

mettre

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

1voto

amiko Points 21

C'est trop de problèmes,Vous pouvez affecter des valeurs directement,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"
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X