【问题标题】:Mutable map with multiple values in ScalaScala中具有多个值的可变映射
【发布时间】:2021-06-18 05:21:51
【问题描述】:

我想要一张地图,这样:

  • 我可以更新它 -> 可变的
  • 我可以有多个值 -> 旧的多地图

即我需要收集表格:

k1 -> v1, k1 -> v2, ..., k2 -> v1, k2 -> v2, k2 -> v3 等

归根结底,我需要收集所有这些信息:

k1 -> Seq(v1,v2), ..., k2 -> Seq(v1,v2,v3)

如何在 Scala 中做到这一点?

编辑

我在 Scastie 试过这个:

val m = new scala.collection.mutable.Map[Int,Int] with scala.collection.mutable.MultiMap[Int,Int]
m += (1 -> 2)
m += (1 -> 3)
m

但我明白了:

illegal inheritance;
 <$anon: Int => Int with Int => scala.collection.mutable.Set[Int]> inherits different type instances of trait Map:
scala.collection.mutable.Map[Int,scala.collection.mutable.Set[Int]] and scala.collection.mutable.Map[Int,Int]

trait MultiMap in package mutable is deprecated (since 2.13.0): Use a scala.collection.mutable.MultiDict in the scala-collection-contrib module

【问题讨论】:

  • @IvanKurchenko 在我的编辑中查看弃用说明
  • @Robdigo 谢谢。好吧,随着消息逐渐减弱,您可以尝试继续使用MultiDict
  • @IvanKurchenko 也没有在 Scastie 工作。另外,问题更多的是在最后一部分,如何按照我问的方式更改集合
  • 您可以使用mutable.Map[Int, List[Int]] 和updateWith 向地图添加元素。您甚至可以编写自己的扩展方法以避免重复逻辑。

标签: scala collections


【解决方案1】:

正如 cmets 部分所讨论的,您可以继续使用来自 scala-collection-contrlib 库的 MultiDict 。示例:

import scala.collection.mutable

def convert[K, V](iterable: Iterable[(K, V)]): mutable.MultiDict[K, V] = {
  iterable.foldLeft(mutable.MultiDict.empty[K, V])(_ addOne _)
}

val list = List("k1" -> "v1", "k1" -> "v2", "k1" -> "v3", "k2" -> "v1", "k3" -> "v1")
val map = convert(list)
println(map.sets)

将打印:HashMap(k1 -&gt; HashSet(v1, v2, v3), k2 -&gt; HashSet(v1), k3 -&gt; HashSet(v1))

斯卡蒂:https://scastie.scala-lang.org/uULFEKUwTVaSHLpJosnXYw

【讨论】:

    【解决方案2】:

    当人们在 scala 中说“避免使用可变结构”时,它尤其适用于那些必须询问有关如何创建多图的问题的人。 我的意思是,这真的不是火箭科学:

        val foo = mutable.Map[Int, List[Int]]().withDefault(_ => Nil)
        foo += 1 -> (1::foo(1))
        foo += 1 -> (2::foo(1))
        foo += 1 -> foo(1).filterNot(Set)
        foo += 1 -> foo(1).tail
    
        tuples.foreach { case (k,v) => foo += k -> (v::foo(k)) }
        //etc.
    

    但如果你不得不问如何做到这一点,你很可能最终会错误地使用它(这对于可变结构非常容易)。我强烈建议您坚持使用不可变集合(并避免一般的可变状态),直到您对语言有足够的掌握,能够明确地确定可变实际上是正确解决方案的情况。

    【讨论】:

      猜你喜欢
      • 2011-03-26
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多