詳細地說,我希望 Map 的鍵是日期和時間,值是 Map(人名 -> 該人在該日期和時間所取的最大值)。我怎樣才能做到這一點?
val d = Map(2020-01-30 -> Seq(Map("fff" -> 177), Map("fsdzf" -> 219), Map("fff" -> 300), Map("fff" -> 0)), 2020-01-26 -> Seq(Map("fvcfdf" -> 188), Map("vav" -> 273)))
TI 希望上面的代碼看起來像下面的代碼。
Map(2020-01-30 -> Map(fff -> 300, fsdzf -> 219), 2020-01-26 -> Map(fvcfdf -> 188, vav -> 273))
uj5u.com熱心網友回復:
像這樣的東西應該作業:
originalMap
.view
.mapValues(_.flatten)
.mapValues(_.groupMapReduce(_._1)(_._2)(_ max _))
.toMap
基本上,首先擺脫內部映射(將外部映射的值轉換為元組串列),然后按第一個元素對這些元組進行分組,并為每個組選擇第二個的最大值。
uj5u.com熱心網友回復:
基本上,您希望將 external 的"values"
(mapValues) (Map
一些地圖的串列)聚合到單個 Map (折疊)中:
d.mapValues { listOfInnerMaps =>
listOfInnerMaps.foldLeft(Map.empty[String, Int])(_ _)
}
// or a shorter version of the above thing:
d.mapValues(_.foldLeft(Map.empty[String, Int])(_ _))
如果你確定串列總是非空的,你也可以使用 reduce(我不推薦):
d.mapValues(listOfInnerMaps => listOfInnerMaps.reduce(_ _))
// or a shorter version of the above thing:
d.mapValues(_.reduce(_ _))
更新
因此,如果您想要每個內部映射的最大值,我建議您遍歷串列,并Map[String, Int]
僅在新值大于舊值時更新累加器:
d.mapValues { listOfMaps =>
listOfMaps.foldLeft(Map.empty[String, Int]) {
case (acc, newMap) =>
newMap.foldLeft(acc) {
case (updatingAcc, (key, value)) =>
updatingAcc.updatedWith(key) {
case Some(oldValue) if value > oldValue => Some(value)
case None => Some(value)
case other => other
}
}
}
}.toMap
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/526708.html
標籤:斯卡拉
上一篇:將scala轉換為Spark
下一篇:如何計算hdfs目錄中的檔案數