2011-08-26 38 views

回答

20

我可以建立一个不可改变的多重映射?

不符合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)} 
14

我有点糊涂了,Multimap不映射到ASet[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)) 
+5

你也可以使用'mapValues',这实际上不会产生一个新的集合,但将作为在值映射'view'。 –

+0

'mapValues' - 不错。我以前从未使用过那种。更新以替代使用。 –

+6

清洁仍然:'val m = l groupBy(_._ 1)mapValues(_ map {_._ 2} toSet)' –

相关问题