我在 scala 中有一個 3 元組陣列,例如:(a:Int, b:Int, val:Double),我需要回傳一個陣列,它對所有對都(a, b)具有最小值val。我很清楚如何通過地圖來做到這一點:
a.map(t => ((t._1,t ._2), t._3)).groupBy(_._1).mapValues(_.map(_._2).min).toArray
但出于記憶體優化的目的,我想避免使用映射。沒有地圖有沒有一種干凈的方法來做到這一點?
uj5u.com熱心網友回復:
Try groupMapReduce,它做的都是一樣的,但在一次通過:
tuples.groupMapReduce(t => (t._1, t._2))(_._3)(_ min _)
可運行示例:
val tuples = List(
(0, 0, 58),
(1, 1, 100),
(0, 0, 1),
(0, 1, 42),
(1, 0, 123),
(1, 0, 3),
(0, 1, 2),
(1, 1, 4)
)
tuples.groupMapReduce(t => (t._1, t._2))(_._3)(_ min _).foreach(println)
輸出:
((0,0),1)
((1,1),4)
((1,0),3)
((0,1),2)
與您的解決方案相比,它應該嚴格減少 GC 的負載,因為它不會為分組值生成任何中間串列,也不會為原始解決方案中的 -step 中的那些mapped 分組值生成任何中間串列。_.map(_._2)
它并沒有完全消除中間Map值,但除非您可以提供任何更有效的結構來存盤值(例如二維陣列,通過將可能a的 s 和bs 限制為相對較小且嚴格為正),否則aMap似乎或多或少是不可避免的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/459748.html
標籤:斯卡拉
