Как работать с Картами в Котлине
Код ниже создает новую карту под названием 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)
}
}
В то время как мы находимся на этом, я хотел бы несколько примеров того, как добавить, удалить и получить запись с карты.
5 ответов
Причина вашего замешательства в том, что 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)
}
}
Плюс-метод на 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")
Это слишком много проблем , Вы можете назначить значения напрямую ,, как это:
@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"
}
}
Вы должны использовать
положил
метод.
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)
}
}
val params: MutableMap<String, String> = HashMap<String, String>()
params.put("1", "A")
params.put("2", "B")