【问题标题】:How to work with Maps in Kotlin如何在 Kotlin 中使用地图
【发布时间】:2016-09-24 16:24:31
【问题描述】:

下面的代码正在创建一个名为nameTable 的新映射,然后向其中添加一个名为 example 的条目,然后尝试打印 Value 的 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)
    }
}

虽然我们在做这件事,但我希望有一些示例来说明如何从地图中添加、删除和获取条目。

【问题讨论】:

    标签: maps kotlin


    【解决方案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 上的 plus 方法会创建一个包含新条目的新映射。它不会改变原始地图。如果你想使用这个方法,你需要这样做:

      fun main() {
          val table = nameTable.plus(Pair("person1", example))
          for (entry in table) {
              println(entry.value.age)
          }
      }
      

      如果要在原始地图中添加条目,则需要像 Java 中那样使用put 方法。

      这可行:

      fun main() {
          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)
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-07
          • 1970-01-01
          • 2016-01-01
          相关资源
          最近更新 更多