我有一个转换以下数据类型的代码:
出发地: SortedMap[Long,SortedMapString,Double]到: SortedMap[String,ArrayDouble]
有人能解释一下这段代码是如何进行上述操作的吗?
val convertedDataWindow = dataWindow.values.foldLeft(SortedMap.empty[String, Array[Double]]) {
case (res0, map) =>
(res0 /: map) {
case (res1, (key, value)) =>
res1.updated(key, res1.getOrElse(key, Array.empty) :+ value)
}
}发布于 2014-12-04 09:45:48
首先考虑一下内部功能:
def something(res0: SortedMap[String, Array[Double]],
map: SortedMap[String, Double]) = (res0 /: map) {
case (res1, (key, value)) =>
res1.updated(key, res1.getOrElse(key, Array.empty) :+ value)
}/:是foldLeft的另一个名称,这与
map.foldLeft(res0) { ...}你知道foldLeft一般是如何工作的吗?它在集合中运行,使用给定的函数依次将每个值“合并”为初始值。这从res0开始,对于map中的每个(key, value),我们使用.updated将其合并到我们的工作结果中:我们向地图中添加一个新条目,其中包含键key和值res1.getOrElse(key, Array.empty) :+ value。也就是说,如果这个键已经有一个条目,我们将value添加到它的末尾;否则,我们将生成一个只包含value的新Array。
因此,将所有这些放在一起,这个函数所做的就是将map合并到res0中,为任何新的键创建新条目,或者将这些值放到任何现有键的Array上。
现在,完整的函数正在执行另一个foldLeft;我们可以将它写成:
dataWindow.values.foldLeft(SortedMap.empty)(something)因此,这是从一个空映射开始,然后依次对每个dataWindow.values,将其合并到我们的工作映射中。
(当然,当我谈到“合并”时,在现实中,每件事都是不可变的,每当我们遍历循环时,我们都在创建一个新的“工作”映射。但有时更清楚的是,想象一个单一的、可变的“工作”地图res)
https://stackoverflow.com/questions/27289848
复制相似问题