Scala在时间戳映射中搜索timeStamps的简单方法

时间:2018-03-15 20:45:12

标签: scala search collections

我有一个

val timestampOffsetMap: Map[ZonedDateTime, Int]

想在timeStamp(a.k.a ZonedDateTime)之前搜索最近的getOffset

def getNearestBeforeTimeStampOffset(timeToCheck: ZonedDateTime): Int = ???

我知道sortedMap并考虑使用它,但不确定是否有更好的方法来解决问题。 此外,我在scala 2.11 for collections API

1 个答案:

答案 0 :(得分:2)

<强>更新

正如Joe Pallas指出的那样,scala的默认实现TreeMap提供了与Java NavigableMap基本相同的功能。但是,API完全不同:在TreeMap上,有方法fromtorange,可以创建TreeMap的范围预测。在这些范围预测中,方法headOptiontailOption可用于选择与ceilfloor基本对应的元素 - 给定键的元素。

API看起来完全不同的原因(它返回整个树而不是单个ceil / floor - 元素),这有点违反直觉,建立一个不可变的远程投影树渐近地和检索单个元素一样昂贵。

尽管如此,我认为将Java集合用于这样一个特定任务没有任何问题,特别是如果API更直观的话。我还怀疑Java的实现可能实际上要快一点并产生更少的垃圾(这是一种推测,我没有测量它)。

原始回答

Java标准集合提供NavigableMap的实现,其中java.util.TreeMap是一个示例。 NavigableMap提供了floorKeyfloorEntryceilingKeyceilingEntry等方法,它们似乎完全符合您的要求:

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]))