我有一个以下类型的嵌套地图数据结构:
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
有人可以帮忙吗?
答案 0 :(得分:0)
我认为您想要的结果类型是Map[String, Seq[Double]
。我将使用Vector
作为排序值,因为它有一个有效的追加方法:+
。
首先,您要删除外部地图的时间键。您可以使用values
或valuesIterator
。然后最简单的方法是对这些值执行“向左折叠”,从空结果图开始并在每一步更新它。您需要两个嵌套折叠,因为您首先遍历地图,然后遍历每个地图的各个元素。
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
。