Scala排序映射没有方法floor或ceil

Scala排序映射没有方法floor或ceil,scala,collections,Scala,Collections,我是Scala新手,但现在我想使用Scala.collection.SortedMap检索地板。我的意思是这样的: val m = SortedMap[Long, String]() def retreiveAndProcess(l: Long) = { val floor = // get the floor of l to m //do some with floor } 您可以使用从、到和到执行所需操作,这些操作可在排序上找到,并声明它们返回集合的范围投影[1]: m.

我是Scala新手,但现在我想使用
Scala.collection.SortedMap
检索地板。我的意思是这样的:

val m = SortedMap[Long, String]()

def retreiveAndProcess(l: Long) = {
    val floor = // get the floor of l to m
    //do some with floor
}

您可以使用
执行所需操作,这些操作可在
排序
上找到,并声明它们返回集合的范围投影[1]

m.to(l).lastKey    //floor

m.from(l).firstKey //ceil
您必须检查是否为空,因为这些将抛出
NoTouchElementException
s。我通常会使用隐式转换添加一些有用的实用程序:

scala> implicit class SortedMapOps[K, V](val m: SortedMap[K, V]) extends AnyVal {
     |   def floor(k: K): Option[(K, V)] = {
     |     val n = m.to(k)
     |     //You could just use n.lastOption here
     |     if (n.isEmpty) None
     |     else Some((n.lastKey, n(n.lastKey)))
     |   }
     | }
defined class SortedMapOps
然后:


[1]-这意味着这是
O(1)
,(或者至少不是
O(N)

你说地板是什么意思?带有作为参数提供的键的映射条目?@ThomasBöhm我是指小于参数的最近键为什么不简单地
范围(lo,hi)
scala> SortedMap(1 -> "a", 2 -> "b", 3 -> "c", 5 -> "e")
res2: scala.collection.immutable.SortedMap[Int,String] = Map(1 -> a, 2 -> b, 3 -> c, 5 -> e)

scala> res2.floor(4)
res3: Option[(Int, String)] = Some((3,c))