例如,我有一个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相应的值中则应该返回.否则,应返回最接近的较小和较大键的值(在没有其他键较小的情况下,仅应返回最接近的较大键的值,反之亦然).
如何实现这一目标?
Map 不保留顺序因此我建议创建一个方法:
Map变成了一个TreeMapto(key).lastOption和from(key).headOption分别在列表中生成下/上映射条目作为选项示例代码如下:
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)