在斯卡拉呼叫 groupBy() 在集合的返回 Map 这里值的收藏品,但我想要一个 MultiMap.什么是做最简单的方法的转换?我可以避免创建一个新的 MultiMap 和复印一切都结束了?

有帮助吗?

解决方案

我认为回答"我必须创建一个新的物体混合在一卡拉特质?"是的"是"。你可以最大限度地减少痛苦的一些具包的目的和隐含的转换。


你的具体问题,我无法强迫groupBy(...)恢复一个可变的地图集可变的,你会需要包装它与"MapProxy与基于".但是,它不是太多线的代码实现自己版本的"groupBy":

package blevins.example

object App extends Application {

  implicit def multiMapable[B](c: Iterable[B]) = new {
    def groupByMM[A](f: B => A) = {
      import scala.collection.mutable._
      val ret = new HashMap[A,Set[B]] with MultiMap[A,B]
      for (e <- c) { ret.addBinding(f(e), e) }
      ret
    } 
  }

  val c = List(1,2,3,4,5,6,7,8,9)
  val mm = c.groupByMM { i => if (i < 5) "alpha" else "beta" }
  mm.addBinding("alpha",12)
  println(mm) // Map(beta -> Set(5, 7, 6, 9, 8), alpha -> Set(3, 1, 4, 2, 12))

}

增编

这里是一个例子包装现有地图[串,设定[Int]]纳入一个基于不复制的价值观:

object App extends Application {
  import scala.collection.mutable._
  val seed: Map[String,Set[Int]] = Map("even" -> Set(2,4,6), "odd" -> Set(1,3,5))

  val multiMap = new MapProxy[String,Set[Int]] with MultiMap[String,Int] {
    val self = seed
  }

  multiMap.addBinding("even", 8)
  println(multiMap) // Map(odd -> Set(5, 3, 1), even -> Set(6, 8, 4, 2))
}

注意,这是不可能的结果groupBy(...)因为种子地图是需要可变和groupBy(...)返回的一个不可改变的地图。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top