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