高效的方法将键和值添加到scala中的Set Map
Posted
技术标签:
【中文标题】高效的方法将键和值添加到scala中的Set Map【英文标题】:efficent way Add key and value to Map of Set in scala 【发布时间】:2017-01-23 09:41:45 【问题描述】:我有一个像这样的 scala 地图:
val myMap: mutable.Map[String, mutable.Set[String]]= mutable.Map[String, mutable.Set[String]]()
我想以更有效的方式添加元素键:字符串和另一个值。添加将检查新的键字符串是否在 Map 中以肯定的情况,然后将新值添加到当前对应的 Set 中。如果键不存在,则添加键并使用第一个元素创建一组新的值:值。
问候 亚瑟特
【问题讨论】:
你已经尝试了什么?我绝对会推荐反对 Scala 中的可变映射。具有不可变映射的 var 允许您在开始抽象代码时正确获取标识/值。 【参考方案1】:给定一个(key, value)
,如果key
存在于地图中,则value
被添加到集合中。如果key
不存在,则将key
与空集添加到map
。
def update(key: String, value: String, map: Map[String, Set[String]]): Unit =
map.get(key)
.map(_ => map(key) += value)
.getOrElse(map(key) = Set[String](value))
【讨论】:
在这个实现中,当键是新的时,您将添加一个新的集合,但我们需要将值添加到这个新集合中。 def update(key: String, value: String, map: Map[String, Set[String]]): Unit = map.get(key).map(_ => map(key) += value).getOrElse(map(key) = Set[String]().+(value)) 太好了,我无权更改您的 cmets。谢谢!!【参考方案2】:您基本上需要的是MultiMap。
import collection.mutable. HashMap, MultiMap, Set
val mm = new HashMap[Int, Set[String]] with MultiMap[Int, String]
mm.addBinding(1, "a")
mm.addBinding(2, "b")
mm.addBinding(1, "c")
println(mm)
//prints Map(2 -> Set(b), 1 -> Set(c, a))
Guava 带有不同的 MultiMap 的types。支持数组、基于哈希、基于链表等。而且您不必混合来创建多图。该api相当elaborate。
在 Scala Multimap 中,您有使用 Map[A,Set[B]]
的限制。你不能做new HashMap[Int, List[String]] with MultiMap[Int, String]
。
【讨论】:
以上是关于高效的方法将键和值添加到scala中的Set Map的主要内容,如果未能解决你的问题,请参考以下文章
使用 for loop .splitlines 循环将键和值添加到字典
从python字典如何将键和值保存到* .txt文件[关闭]