我有一个嵌套的地图数据结构,它的类型如下:
SortedMap[Time: Long,SortedMap[Name: String, Value: Double]]"Time“元素的类型为Long,表示数据的时间戳。" name“元素的类型为String,表示元素的名称。" value“元素属于Double类型,并指示时间戳"Time”的元素值。
基本思想是,对于每个时间戳,我们有几个元素,每个元素都有一个当前时间戳的特定值。
我想要的结果是每个“Array[Double]”元素都有一个名称或List[Double]。我不需要"Time“值,除非我想以同样的方式对结果进行排序。
示例:
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有人能帮帮忙吗?
发布于 2014-11-02 21:34:20
我认为您想要的结果类型是Map[String, Seq[Double]。我将对排序后的值使用Vector,因为它有一个高效的追加方法:+。
首先,您想要删除外部map的时间键。为此,您可以使用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。
https://stackoverflow.com/questions/26696885
复制相似问题