Как работать с картами в Котлине

В приведенном ниже коде создается новая карта под названием nameTable , а затем добавляется запись с именем example, а затем пытается напечатать свойство name значения.

Когда я запускаю его, кажется, что операция «плюс» не добавила новую запись на карту, как я думал.

Так что я делаю неправильно?

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

Хотя мы и находимся в этом, мне бы понравились некоторые примеры добавления, удаления и получения записи с карты.

    Причиной вашей путаницы является то, что plus не является оператором мутации, а это значит, что он работает с (только для чтения) Map , но не изменяет сам экземпляр. Это подпись:

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

    То, что вы хотите, – это set операторов MutableMap , определенный в MutableMap :

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

    Поэтому ваш код может быть переписан (с некоторыми дополнительными улучшениями):

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

    Метод plus на Map создает новую карту, содержащую новую запись. Он не мутирует исходную карту. Если вы хотите использовать этот метод, вам нужно будет сделать это:

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

    Если вы хотите добавить запись на исходную карту, вам нужно использовать метод put как в Java.

    Это будет работать:

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

    Чтобы получить и удалить записи из MutableMap , вы можете использовать это:

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

    Вы должны использовать

    положил

    метод.

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

    Это слишком много проблем, вы можете назначать значения напрямую, например:

     @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" } } 
    Intereting Posts
    Пользовательский тип Kotlin Generics с использованием подстановочного знака Миссия по срокам не выполняет миссии : app: ошибка kaptDebugKotlin при запуске модульного теста Как объявить и инициализировать MutableSet в Котлине? kotlin, которая может использовать соединение httpS без проверки сертификата (например, curl – insecure) присваивать переменную только в том случае, если она равна нулю Как стирается стирание типа Ошибка – невозможно изменить заголовок supportActionBar (Неизвестный источник: 7) ошибка в kotlin android Каков правильный способ создания нового экземпляра родового класса в котлин? Схема проектирования моста, приводящая к слишком большому количеству генериков Котлин андроид ошибка ProGuard Почему метод ByteBuffer putShort (значение) работает неправильно в моем случае? Как работают функции высшего порядка Котлина? Dagger2 – дубликат экземпляра в DoubleCheck