首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转换SortedMap数据类型

转换SortedMap数据类型
EN

Stack Overflow用户
提问于 2014-11-02 15:08:52
回答 1查看 62关注 0票数 0

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

代码语言:javascript
复制
SortedMap[Time: Long,SortedMap[Name: String, Value: Double]]

"Time“元素的类型为Long,表示数据的时间戳。" name“元素的类型为String,表示元素的名称。" value“元素属于Double类型,并指示时间戳"Time”的元素值。

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

我想要的结果是每个“Array[Double]”元素都有一个名称或List[Double]。我不需要"Time“值,除非我想以同样的方式对结果进行排序。

示例:

代码语言:javascript
复制
val dataType = SortedMap(1000L -> SortedMap("component1" -> 1.0, 
  "component2" -> 1.1), 2000L -> SortedMap("component1" -> 1.1), 
   3000L -> SortedMap("component1" -> 0.95))

我想要的结果如下:

代码语言:javascript
复制
"component1" - 1.0, 1.1, 0.95
"component2" - 1.1

有人能帮帮忙吗?

EN

回答 1

Stack Overflow用户

发布于 2014-11-02 21:34:20

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

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

代码语言:javascript
复制
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) …,该方法产生的语法略有不同:

代码语言:javascript
复制
dataType.values.foldLeft(Map.empty[String, Vector[Double]]) { case (res0, map) …

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26696885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档