【问题标题】:Convert SortedMap Data Type转换 SortedMap 数据类型
【发布时间】:2014-11-02 07:08:52
【问题描述】:

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

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

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

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

我想要的结果是每个“名称”元素的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

有人可以帮忙吗?

【问题讨论】:

  • 您能否更清楚地解释您的问题? SortedMap 存储什么数据?什么是Time
  • 能否给一个简短的scala sn-p,问题不清楚。

标签: scala collections sortedmap


【解决方案1】:

我认为您想要的结果类型是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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 2021-12-24
    • 2013-09-17
    • 2017-07-07
    相关资源
    最近更新 更多