【发布时间】:2011-08-26 19:46:59
【问题描述】:
假设我有一个元组列表List[(A, B)]。将其转换为multimap(将A 映射到Set[B])的最佳方法是什么?我可以构建一个不可变 multimap 吗?
【问题讨论】:
假设我有一个元组列表List[(A, B)]。将其转换为multimap(将A 映射到Set[B])的最佳方法是什么?我可以构建一个不可变 multimap 吗?
【问题讨论】:
我可以构建一个不可变的多图吗?
不适用于 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)}
【讨论】:
我有点困惑,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))}