如何在Kotlin中使用地图

时间:2016-05-26 15:07:09

标签: maps kotlin

下面的代码是创建一个名为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)
    }
}

虽然我们正在努力,但我会喜欢一些如何添加,删除和从地图中获取条目的示例。

4 个答案:

答案 0 :(得分:38)

您混淆的原因是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)
    }
}

答案 1 :(得分:10)

Map上的加号方法会创建一个包含新条目的新地图。它不会改变原始地图。如果要使用此方法,则需要执行以下操作:

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

如果要将条目添加到原始地图,则需要使用Java中的put方法。

这样可行:

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

答案 2 :(得分:2)

这太麻烦了,您可以直接指定值,如下所示:

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

答案 3 :(得分:1)

你必须使用

  

方法

var express = require('express');
var app = express();
var path = require('path');
var routes = require('c:/monex/routes/index');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
app.use(express.static('c:/monex/admin'));
app.use('/', routes);
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
   extended: true
}));
app.use(cookieParser());

 app.use(function (err, req, res, next) {
  res.render('c:/monex/404.html', { status: 404, url: req.url });
 })


 var server = app.listen(9090, function () {
 var host = server.address().address
 var port = server.address().port
   console.log("MonexJS  listening at", port)
 })