2

我有两个地图,我想将它们连接起来。

我尝试了这里给出的几乎所有示例合并两个映射并对相同键的值求和的最佳方法?但它忽略键的所有值metrics,只存储最后一个值。

我已经下载scalaz-full_2.9.1-6.0.3.jar并导入了它,import scalaz._但它对我不起作用。如何将这两个具有多个值的映射连接到相同的键?

编辑 :-

现在我试过了

  val map = new HashMap[String, Set[String]] with MultiMap[String, String]
  map.addBinding("""report_type""" , """performance""")
  map.addBinding("""start_date""" ,start_date)
  map.addBinding("""end_date""" , end_date)
  map.addBinding("metrics" , "plays")
  map.addBinding("metrics", "displays")
  map.addBinding("metrics" , "video_starts")
  map.addBinding("metrics" , "playthrough_25")
  map.addBinding("metrics", "playthrough_50")
  map.addBinding("metrics", "playthrough_75")
  map.addBinding("metrics", "playthrough_100")

  val map1 = new HashMap[String, Set[String]] with MultiMap[String, String]
  map1.addBinding("""dimensions""" , """asset""")
  map1.addBinding("""limit""" , """50""")

并尝试使用此链接将这个可变映射转换为不可变类型

val asset_query_string = map ++ map1
val asset_query_string_map =(asset_query_string map { x=> (x._1,x._2.toSet) }).toMap[String, Set[String]]

但我仍然得到

i_ui\config\config.scala:51: Cannot prove that (String, scala.collection.immutable.Set[String]) <:< (St
ring, scala.collection.mutable.Set[String]).
11:10:13.080 [ERROR] i.g.a.ZincCompiler$ - val asset_query_string_map =(asset_query_string map { x=> (x
._1,x._2.toSet) }).toMap[String, Set[String]]
4

3 回答 3

4

您的问题与连接无关,而是与指标映射的声明有关。Map 中的单个键不可能有多个值。也许你应该看看这个集合:

http://www.scala-lang.org/api/2.10.3/index.html#scala.collection.mutable.MultiMap

于 2014-07-21T11:53:44.467 回答
1

地图中不能有重复的键。

对于简单的地图,不可能有重复的键,如果地图中有重复的键,则需要最后一个

但你可以使用 MultiMap

import collection.mutable.{ HashMap, MultiMap, Set }
val mm = new HashMap[String, Set[String]] with MultiMap[String, String]
mm.addBinding("metrics","plays")
mm.addBinding("metrics","displays")
mm.addBinding("metrics","players")
println(mm,"multimap")//(Map(metrics -> Set(players, plays, displays)),multimap)
于 2014-07-21T12:16:11.650 回答
0

我能够创建两个 MultiMap,但是当我尝试连接val final_map = map1 ++ map2 并尝试在此处给出的答案Mutable MultiMap to immutable Map

但是我的问题没有解决,我得到了

config\config.scala:51: Cannot prove that (String, scala.collection.immutable.Set[String]) <:< (St
ring, scala.collection.mutable.Set[String]).

终于解决了

val final_map = map1 ++ map2
val asset_query_string_map = final_map.map(kv => (kv._1,kv._2.toSet)).toMap
于 2014-07-22T05:52:37.497 回答