在元组中找到最小元素的最佳方法

Best way to find min of element in tuple

我在 scala 中有一个三元组数组:(a:Int, b:Int, val:Double),我需要 return 一个数组,所有对 (a, b) 的最小值 [=13] =].我很清楚如何通过转到地图来做到这一点:

a.map(t => ((t._1,t ._2), t._3)).groupBy(_._1).mapValues(_.map(_._2).min).toArray

但出于内存优化的目的,我想避免映射。有没有不使用 Map 的简洁方法?

尝试 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 的负载,因为它不会为分组值生成任何中间列表,也不会为 [=15= 中的 mapped 分组值生成任何中间列表]-进入您的原始解决方案。

它并没有完全消除中间Map,但除非你能提供任何更有效的结构来存储值(例如二维数组,通过限制可能的a s 和 bs 相对较小且严格为正),Map 的出现似乎或多或少是不可避免的。