scala - Scala中具有多个值的可变映射
问题描述
我想要一张地图,以便:
- 我可以更新它-> 可变的
- 我可以有多个值-> 旧的多图
即我需要有一个表格的集合:
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
解决方案
当人们在 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.
但是如果你不得不问如何做到这一点,你很可能最终会错误地使用它(这对于可变结构非常容易)。我强烈建议您坚持使用不可变集合(并避免一般的可变状态),直到您对语言有足够的掌握,能够明确地确定可变实际上是正确解决方案的情况。
推荐阅读
- nltk - StanfordNERTagger 编译中的 UnicodeDecodeError
- angular - How to use more than one NGRX action that does the same thing following "action hygiene" guideline?
- c# - repository.InsertAsync always returns entity.Id 0
- intellij-idea - 从插件在 IntelliJ 中创建拆分窗格
- ms-access - 在 MS Access 中编辑记录时,如何使自动生成的编号保持不变?
- kotlin - 如何将带有偏移量(“2019-01-29+01:00”)的日期反序列化为“java.time”相关类?
- javascript - 在javascript自动完成中获取php数组
- protractor - 量角器黄瓜没有生成魅力报告
- jquery - 通过类而不是元素名称将元素值传递给 jQuery.validator.addMethod
- java - 从sharepoint解析json?