Я не знаю scala, но вот бинарный поиск, с которым вы можете сравнить более функциональные ответы. Я не думаю, что в этом есть стыд. Обратите внимание, что нет никакого преимущества в бинарном поиске конечного индекса, так как вы все равно должны скопировать элементы:
private def getSignalsFromCache(mapId: String, mac: String, startTime: Long, endTime: Long): Seq[Signal] = {
val signals = getCache(VehicleWithMap(mapId, mac))
var startIndex: Int = 0
var endIndex: Int = signals.size
while(startIndex<endIndex) {
var testIndex: int = startIndex + (endIndex-startIndex)/2
if (signals(testIndex).timestamp < startTime) {
startIndex = testIndex + 1
} else {
endIndex = testIndex
}
}
while(endIndex < signals.size && signals(endIndex).timestamp <= endTime) {
endIndex = endIndex + 1
}
signals.slice(startIndex, endIndex)
}
Обратите внимание, что в конце я включил сигналы с timestamp == endTime
, потому что это то, что вы сделали ... что делает интерфейс немного странным. Обычно такой метод написан так, чтобы возвращать сигналы с startTime <= timeStamp < endTime
, поэтому, возможно, вы захотите подумать об изменении этого.