转换SortedMap数据类型

时间:2014-11-02 07:08:52

标签: scala collections sortedmap

我有一个以下类型的嵌套地图数据结构:

SortedMap[Time: Long,SortedMap[Name: String, Value: Double]]

“Time”元素的类型为Long,表示数据的时间戳。 “Name”元素的类型为String,表示元素的名称。 “Value”元素的类型为Double,表示时间戳“Time”的元素值。

基本思想是,对于每个时间戳,我们有几个元素,每个元素都有一个特定的当前时间戳值。

我想要的结果是每个“Name”元素的Array[Double]List[Double]。我不需要“时间”值,除非我希望以相同的方式对结果进行排序。

示例:

val dataType = SortedMap(1000L -> SortedMap("component1" -> 1.0, 
  "component2" -> 1.1), 2000L -> SortedMap("component1" -> 1.1), 
   3000L -> SortedMap("component1" -> 0.95))

我想要的结果如下:

"component1" - 1.0, 1.1, 0.95
"component2" - 1.1

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

我认为您想要的结果类型是Map[String, Seq[Double]。我将使用Vector作为排序值,因为它有一个有效的追加方法:+

首先,您要删除外部地图的时间键。您可以使用valuesvaluesIterator。然后最简单的方法是对这些值执行“向左折叠”,从空结果图开始并在每一步更新它。您需要两个嵌套折叠,因为您首先遍历地图,然后遍历每个地图的各个元素。

import scala.collection.immutable.SortedMap
val dataType = SortedMap(
  1000L -> SortedMap("component1" -> 1.0, "component2" -> 1.1),
  2000L -> SortedMap("component1" -> 1.1), 
  3000L -> SortedMap("component1" -> 0.95)
)

(Map.empty[String, Vector[Double]] /: dataType.values) { case (res0, map) =>
  (res0 /: map) { case (res1, (key, value)) =>
    res1.updated(key, res1.getOrElse(key, Vector.empty) :+ value)
  }
}

// Map(component1 -> Vector(1.0, 1.1, 0.95), component2 -> Vector(1.1))

请注意左侧调用(init /: coll) …。您可以使用替代方法coll.foldLeft(init) …,它会产生稍微不同的语法:

dataType.values.foldLeft(Map.empty[String, Vector[Double]]) { case (res0, map) …

如果您希望组件名称保持排序,则可以在结果中将Map换成SortedMap