如何从地图获取最接近的值?

时间:2019-04-02 15:34:18

标签: scala maps binary-search

我有3个映射,键为Long,值作为2 Doubles的元组)

A : ( 123 -> (1.2,1.3), 567 -> (2.4,2.6), 1200 ->(3.6,5.9))  
B : ( 125 -> (1.22,1.33), 570 -> (2.44,2.66), 1205 ->(3.66,5.99))  
C:  ( 128 -> (1.222,1.3333), 575 -> (2.444,2.666), 1208 ->(3.666,5.999))  

对于A中的每个键,我想从B和C中获取最接近的值,并将3连接到结果映射中。
从上面的结果来看,我应该得到一个如下的结果图:

D : (123 -> ( (1.2,1.3), (1.22,1.33), (1.222,1.3333)), 567-> ((2.4,2.6),(2.44,2.66),(2.444,2.666)) , 1200-> ((3.6,5.9),(3.66,5.99), (3.666,5.999))  

如何以一种清晰的scala方式实现这一目标?

1 个答案:

答案 0 :(得分:1)

如果我正确地理解了您的要求,则如下所示应该可以满足您的要求:

def combineClosestKeys[V](m1: Map[Long, V], m2: Map[Long, V], m3: Map[Long, V]) = {
  def closest(x: Long, s: Iterable[Long]) = s.minBy(e => math.abs(e - x))

  m1.map{ case (k, v) =>
    (k, v :: m2(closest(k, m2.keys)) :: m3(closest(k, m3.keys)) :: Nil)
  }
}

请注意,上述方法假定提供的Map是非空的。

使用方法:

val mapA = Map(123L -> (1.2, 1.3), 567L -> (2.4, 2.6), 1200L -> (3.6, 5.9))
val mapB = Map(125L -> (1.22, 1.33), 570L -> (2.44, 2.66), 1205L -> (3.66, 5.99))
val mapC = Map(128L -> (1.222, 1.3333), 575L -> (2.444, 2.666), 1208L -> (3.666, 5.999))

combineClosestKeys(mapA, mapB, mapC)
// res1: scala.collection.immutable.Map[Long,List[(Double, Double)]] = Map(
//   123 -> List((1.2,1.3), (1.22,1.33), (1.222,1.3333)),
//   567 -> List((2.4,2.6), (2.44,2.66), (2.444,2.666)),
//   1200 -> List((3.6,5.9), (3.66,5.99), (3.666,5.999))
// )