高效的方法将键和值添加到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 循环将键和值添加到字典

将键和值添加到优先级队列中并在 Java 中按键排序

从python字典如何将键和值保存到* .txt文件[关闭]

获取map集合中的键和值

如何在使用 Scala-Play Json 框架解析 Json 时获取键和值?

如何从数组中的对象添加新的键和值?