我有以下格式的数据类型:
Iterable[scala.collection.SortedMap[String,Double]]
我需要以下数据类型:
scala.collection.mutable.Map[String, Double]
由于
答案 0 :(得分:2)
首先将迭代器转换为序列,然后可以将其转换为可变Map
。为了说明这一点,比如说
val a: scala.collection.SortedMap[String,Double] = SortedMap("a" -> 1.1, "b" -> 2.2)
然后
val m = scala.collection.mutable.Map( a.iterator.toSeq: _*)
m: scala.collection.mutable.Map[String,Double] = Map(b -> 2.2, a -> 1.1)
请注意,生成的Map
中的排序会丢失。
答案 1 :(得分:2)
假设您想要的是将scala.collection.SortedMap[String,Double]
转换为scala.collection.mutable.Map[String, Double]
,您可以执行以下操作:
val m1 = SortedMap("key1" -> 1.0, "key2" -> 2.0) // immutable
val m2 = scala.collection.mutable.Map[String, Double]() ++= m1 // mutable
但是,如果您真的想将Iterable[scala.collection.SortedMap[String,Double]]
转换为scala.collection.mutable.Map[String, Double]
,那么您有点不清楚您对结果的期望是什么。
希望它有所帮助!
编辑:那么这意味着您真的想将Iterable转换为单个可变映射。嗯,你可以做到这一点,虽然它看起来像一个非常奇怪的转换。很高兴知道你想要转换它的原因:
val m1 = SortedMap("key1" -> 1.0, "key2" -> 2.0) // immutable
val m2 = SortedMap("key3" -> 3.0, "key4" -> 4.0) // immutable
val it = Iterable(m1, m2)
val z = scala.collection.mutable.Map[String, Double]() ++= it.foldLeft[List[(String, Double)]](Nil)((x,m) => m.toList ::: x)
答案 2 :(得分:0)
它看起来更像是黑客,但无论如何
scala> val a = collection.SortedMap("a" -> 1.1, "b" -> 2.2)
a: scala.collection.SortedMap[String,Double] = Map(a -> 1.1, b -> 2.2)
scala> type MMap = collection.mutable.Map[String, Double]
defined type alias MMap
scala> a.to[({type l[A] = collection.mutable.Map[String, Double]})#l]
res1: scala.collection.mutable.Map[String,Double] = Map(b -> 2.2, a -> 1.1)
将Map
转换为mutable.Map
scala> a.to[({type l[a] = MMap})#l]
res0: scala.collection.mutable.Map[String,Double] = Map(b -> 2.2, a -> 1.1)
将Iterable[Map]
转换为mutable.Map
scala> val as = Iterable.fill(1)(a)
as: Iterable[scala.collection.SortedMap[String,Double]] = List(Map(a -> 1.1, b -> 2.2))
scala> val ms: MMap = as.flatMap(_.to[({type l[a] = MMap})#l])(collection.breakOut)
ms: MMap = Map(b -> 2.2, a -> 1.1)
另请注意,在这种情况下,交叉键将被后一个替换。有关如何使用相同的键合并地图,请参阅this one。