如何通过scala中的给定键从映射中获取最接近的值?

刘思凡*_*刘思凡 3 dictionary scala

例如,我有一个Map[Integer,String]喜欢

val map = Map(1 -> "a", 2 -> "b", 3 -> "c", 5 -> "d", 9 -> "e", 100 -> "z")
Run Code Online (Sandbox Code Playgroud)
  • 如果给定键是2,则预期"b"返回.

  • 如果给定键是50,则预期"e"和"z"返回.

  • 如果给定键为0,则预期"a"返回.

换句话说,如果密钥存在于Map相应的值中则应该返回.否则,应返回最接近的较小和较大键的值(在没有其他键较小的情况下,仅应返回最接近的较大键的值,反之亦然).

如何实现这一目标?

Leo*_*o C 6

Map 不保留顺序因此我建议创建一个方法:

  1. 把它Map变成了一个TreeMap
  2. 使用to(key).lastOption和from(key).headOption分别在列表中生成下/上映射条目作为选项
  3. 展平列表并提取Map值:

示例代码如下:

val map = Map(1->"a", 2->"b", 100->"z", 9->"e", 3->"c", 5->"d")

def closestValues(m: Map[Int, String], key: Int): Seq[String] = {
  import scala.collection.immutable.TreeMap
  val tm = TreeMap(m.toSeq: _*)

  Seq( tm.to(key).lastOption, tm.from(key).headOption ).
    flatten.distinct.map{ case (k, v) => v }
}

closestValues(map, 0)
// res1: Seq[String] = List(a)

closestValues(map, 2)
// res2: Seq[String] = List(b)

closestValues(map, 50)
// res3: Seq[String] = List(e, z)

closestValues(map, 101)
// res4: Seq[String] = List(z)
Run Code Online (Sandbox Code Playgroud)