Подтвердить что ты не робот

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

В приведенном ниже коде создается новая карта с именем 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)
    }
}

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

4b9b3361

Ответ 1

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

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

То, что вы хотите, является мутирующим оператором set, определенным на 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)
    }
}

Ответ 2

Плюс-метод на 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")

Ответ 3

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

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

Ответ 4

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

ставить

метод.

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