Как получить ближайшее значение с карты? - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть 3 карты с длинным ключом и значением как кортеж из двух двойных)

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 Ответ

1 голос
/ 02 апреля 2019

Если я правильно понимаю ваше требование, то что-то вроде ниже должно получить то, что вы хотите:

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))
// )
...