如何将SortedMap转换为可变Map

时间:2014-11-11 09:58:39

标签: scala map

我有以下格式的数据类型:

Iterable[scala.collection.SortedMap[String,Double]]

我需要以下数据类型:

scala.collection.mutable.Map[String, Double]

由于

3 个答案:

答案 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