使用现有密钥(Scala)将键值对添加到HashMap

时间:2017-06-26 08:33:52

标签: scala

我有一个以下的HashMap

import collection.mutable.HashMap
val map = mutable.HashMap("key" -> mutable.HashMap("key" -> "value",
                                                    "key2" -> "value2"),
                          "key2" -> mutable.HashMap("key" -> "value",
                                                    "key2" -> "value2"))

如何让地图看起来像

val map = mutable.HashMap("key" -> mutable.HashMap("key" -> "value",
                                                    "key2" -> "value2"),
                          "key2" -> mutable.HashMap("key" -> "value",
                                                    "key2" -> "value2",
                                                    "key3" -> "value3"),
                          "key3" -> mutable.HashMap("key" -> "value"))

在我的脑海中,它会像这样,但我找不到正确的方法。

map.get("key2").put("key3" -> "value3")
map.put("key3" -> ("key" -> "value3"))

最终我想要一个易于转换为Json的结构

2 个答案:

答案 0 :(得分:1)

put方法不适用于key -> value形式的参数。您必须使用+ - 运算符。另外.get(key)会返回Option,因此您必须.map

map.get("key2").map(_ + "key3" -> "value3")
map += ("key3" -> mutable.HashMap("key" -> "value3"))

同样在第二行中,您需要显式创建一个HashMap,否则它不会匹配地图的类型([String, HashMap])。

这应该回答你的问题,但是Yuval Itzchakov是对的,如果你有一个固定的结构,那么使用案例类和JSON序列化程序(例如JacksonJson4s可能是个好主意。对象。

答案 1 :(得分:1)

你不能使用

map.get("key2").put("key3" -> "value3")

因为它返回Option并且它需要两个参数,而不是元组。您需要首先通过调用get来解包值,然后像这样调用它:

map.get("key2").get.put("key3", "value3")

但是有更简单的方法可以将新值添加到可变映射中:

map("key3") = mutable.HashMap("key" -> "value", "key2" -> "value2") 
map("key2")("key3") = "value3"

// or 

map += ("key3" -> mutable.HashMap("key" -> "value", "key2" -> "value2"))
map("key2") += ("key3" -> "value3")