合并scala映射并根据条件更新公共键

阿拜

我编写了以下代码来合并地图并更新公共键。有没有更好的方法来写这个

  case class Test(index: Int, min: Int, max: Int, aggMin: Int, aggMax: Int)
  def mergeMaps(oldMap: Map[Int, Test], newMap: Map[Int, Test]): Map[Int, Test] = {
    val intersect: Map[Int, Test] = oldMap.keySet.intersect(newMap.keySet)
      .map(indexKey => indexKey -> (Test(newMap(indexKey).index, newMap(indexKey).min, newMap(indexKey).max,
        oldMap(indexKey).aggMin.min(newMap(indexKey).aggMin), oldMap(indexKey).aggMax.max(newMap(indexKey).aggMax)))).toMap
    val merge = (oldMap ++ newMap ++ intersect)
    merge
  }

这是我的测试用例

it("test my case"){
  val oldMap = Map(10 -> Test(10, 1, 2, 1, 2), 25 -> Test(25, 3, 4, 3, 4), 46 -> Test(46, 3, 4, 3, 4), 26 -> Test(26, 1, 2, 1, 2))
  val newMap = Map(32 -> Test(32, 5, 6, 5, 6), 26 -> Test(26, 5, 6, 5, 6))
  val result = mergeMaps(oldMap, newMap)
  //Total elements count should be map 1 elements + map 2 elements
  assert(result.size == 5)
  //Common key element aggMin and aggMax should be updated, keep min aggMin and max aggMax from 2 common key elements and keep min and max of second map key
  assert(result.get(26).get.aggMin == 1)//min aggMin -> min(1,5)
  assert(result.get(26).get.aggMax == 6)//max aggMax -> max(2,6)
  assert(result.get(26).get.min == 5)// 5 from second map
  assert(result.get(26).get.max == 6)//6 from second map
}
jwvh

这是对解决方案的略有不同的看法。

def mergeMaps(oldMap :Map[Int,Test], newMap :Map[Int,Test]) :Map[Int,Test] =
  (oldMap.values ++ newMap.values)
    .groupBy(_.index)
    .map{ case (k,v) =>
      k -> v.reduceLeft((a,b) => 
          Test(k, b.min, b.max, a.aggMin min b.aggMin, a.aggMax max b.aggMax))
    }

我本可以使用groupBy()withmapValues()而不是,map()但这不会导致纯Map.

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

根据键映射字典

来自分类Dev

如何根据 Pandas 中的公共键合并两个数据集?

来自分类Dev

Scala根据条件在2个列表之间合并

来自分类Dev

条件键映射AHK

来自分类Dev

根据条件合并xml

来自分类Dev

通过公共外键合并表字段

来自分类Dev

根据值合并数组的键

来自分类Dev

根据键合并列excel

来自分类Dev

如果根据条件未找到映射中的键,如何应用逻辑?

来自分类Dev

根据条件映射列的值

来自分类Dev

合并值键:具有公共键的值RDD

来自分类Dev

根据条件合并相邻行

来自分类Dev

根据条件合并/合并数据框/表->或<

来自分类Dev

根据django中的条件查找公共元素

来自分类Dev

根据条件更新表

来自分类Dev

根据使用的键盘重新映射键盘键

来自分类Dev

Scala-合并列表以进行映射

来自分类Dev

根据对象的键和值合并对象

来自分类Dev

根据PHP中的键合并数组

来自分类Dev

根据键合并到数据集

来自分类Dev

根据javascript中的键合并对象

来自分类Dev

PHP:合并具有公共键的倍数数组

来自分类Dev

根据映射键从接口映射中选择类型

来自分类Dev

根据公共字段将两行合并为一

来自分类Dev

根据公共数据合并两个文件

来自分类Dev

根据公共列值合并两个文件

来自分类Dev

根据字典数组中的公共键查找比率

来自分类Dev

根据条件对哈希映射值进行排序

来自分类Dev

R根据等于以外的条件合并