我有一个
val timestampOffsetMap: Map[ZonedDateTime, Int]
想在timeStamp(a.k.a ZonedDateTime)之前搜索最近的getOffset
def getNearestBeforeTimeStampOffset(timeToCheck: ZonedDateTime): Int = ???
我知道sortedMap并考虑使用它,但不确定是否有更好的方法来解决问题。 此外,我在scala 2.11 for collections API
答案 0 :(得分:2)
<强>更新强>
正如Joe Pallas指出的那样,scala的默认实现TreeMap
提供了与Java NavigableMap
基本相同的功能。但是,API完全不同:在TreeMap
上,有方法from
,to
和range
,可以创建TreeMap
的范围预测。在这些范围预测中,方法headOption
和tailOption
可用于选择与ceil
和floor
基本对应的元素 - 给定键的元素。
API看起来完全不同的原因(它返回整个树而不是单个ceil
/ floor
- 元素),这有点违反直觉,建立一个不可变的远程投影树渐近地和检索单个元素一样昂贵。
尽管如此,我认为将Java集合用于这样一个特定任务没有任何问题,特别是如果API更直观的话。我还怀疑Java的实现可能实际上要快一点并产生更少的垃圾(这是一种推测,我没有测量它)。
原始回答
Java标准集合提供NavigableMap
的实现,其中java.util.TreeMap
是一个示例。 NavigableMap
提供了floorKey
,floorEntry
,ceilingKey
和ceilingEntry
等方法,它们似乎完全符合您的要求:
import java.util.TreeMap
import java.time.ZonedDateTime
val tm = new TreeMap[ZonedDateTime, Int] // + add entries
def getNearestBeforeTimeStampOffset(timeToCheck: ZonedDateTime)
: Int = tm.floorEntry(timeToCheck).getValue
我不确定Scala的TreeMap
是否提供了类似的功能,至少它不会被称为名称中带有“ceiling”或“floor”的任何内容。这个eternally old question here也没有立即指向与NavigableMap
类似的功能,因此在这种情况下使用Java TreeMap
可能更容易。
要将scala Map
转换为java.util.TreeMap
,此类内容应该有效:
val yourMap: Map[ZonedDateTime, Int] = ???
import scala.collection.JavaConverters._
val tm = new java.util.TreeMap((yourMap.asJava : java.util.Map[ZonedDateTime, Int]))