【问题标题】:How to build a multimap from a list of tuples in Scala?如何从 Scala 中的元组列表构建多映射?
【发布时间】:2011-08-26 19:46:59
【问题描述】:

假设我有一个元组列表List[(A, B)]。将其转换为multimap(将A 映射到Set[B])的最佳方法是什么?我可以构建一个不可变 multimap 吗?

【问题讨论】:

    标签: scala multimap


    【解决方案1】:

    我可以构建一个不可变的多图吗?

    不适用于 Scala 标准库中的 MultiMap。当然,你也可以自己写。

    将其转换为多图的最佳方法是什么?

    import scala.collection.mutable.{HashMap, Set, MultiMap}
    
    def list2multimap[A, B](list: List[(A, B)]) = 
      list.foldLeft(new HashMap[A, Set[B]] with MultiMap[A, B]){(acc, pair) => acc.addBinding(pair._1, pair._2)}
    

    【讨论】:

      【解决方案2】:

      我有点困惑,Multimap 不会将A 映射到Set[B],它会将A 映射到B,其中B 可以有很多值。既然你想要一些不可变的东西,我将把它改成Map[A, Set[B]],它不是Multimap,而是做你说你想要的事情之一。

      // This is your list of (A, B)
      val l = List((1, "hi"),
                   (2, "there"),
                   (1, "what's"),
                   (3, "up?"))
      // Group it and snip out the duplicate 'A'
      // i.e. it initially is Map[A, List[(A, B)]] and we're going to convert it
      // to Map[A, Set[B]]
      val m = l.groupBy(e => e._1).mapValues(e => e.map(x => x._2).toSet)
      println(m)
      // Prints: Map(3 -> Set(up?), 1 -> Set(hi, what's), 2 -> Set(there))
      

      【讨论】:

      • 你也可以使用mapValues,它实际上不会产生一个新的集合,而是作为一个映射的view值。
      • mapValues - 很好。我以前从来没有用过那个。更新为使用它。
      • 更清洁:val m = l groupBy (_._1) mapValues (_ map {_._2} toSet)
      • 那不干净,只是字符少了。
      • 直接使用地图:list.groupBy(_._1).map{case(x, xs) => (x, xs.map(_._2))}
      猜你喜欢
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      • 2017-10-04
      • 2015-08-18
      相关资源
      最近更新 更多