Scala加入数组并降低价值

时间:2018-04-28 17:12:30

标签: arrays scala reduce

我有两个Key / Value Pairs Array [(String,Int)]数组,我想加入,但只有在键上匹配时才返回最小值。

val a = Array(("personA", 1), ("personB", 4), ("personC", 5))
val b = Array(("personC", 4), ("personA", 2))

目标:c = Array((personA, 1), (personC, 4))

val c = a.join(b).collect()

结果为:c = Array((personA, (1, 2)), (personC, (5, 4)))

我尝试使用join方法实现此目的,但在将值加入单个数组后很难减少值:Array[(String, (Int, Int))]

1 个答案:

答案 0 :(得分:2)

试试这个:

val a = Array(("personA", 1), ("personB", 4), ("personC", 5))
val b = Array(("personC", 4), ("personA", 2))
val bMap = b.toMap
val cMap = a.toMap.filterKeys(bMap.contains).map {
  case(k, v) => k -> Math.min(v, bMap(k))
}
val c = cMap.toArray

toMap方法将Array[(String, Int)]转换为Map[String, Int];然后,filterKeys仅用于保留a.toMap中同样位于b.toMap的密钥(字符串)。然后,map操作为每个键选择两个可用值的最小值,并创建一个新的映射,将每个键与该最小值相关联。最后,我们使用Array[(String, Int)]将结果地图转换回toArray

<强>已更新

顺便说一句:我不确定你从哪里获得Array.join方法:Array没有这样的方法,所以a.join(b)没有为我工作。但是,我怀疑ab可能是 Apache Spark PairRDD集合(或类似的东西)。如果是这种情况,那么您可以加入ab,然后将值映射到每对的最小值(reduce操作不是您想要的)如下:

a.join(b).mapValues(v => Math.min(v._1, v._2)).collect

collect可根据需要将结果转换为Array[(String, Int)]