这取决于几件事。
- 您要查找的时间戳是否已知在数组中。
- 之间是什么意思。
- 数组中的元素是否唯一。
让我们假设数组已排序,或者您将自己事先对其进行排序。
如果your_timestamp
已知在数组中,您可以使用 找到它的索引timestamp_array.index(your_timestamp)
。从逻辑上讲,your_timestamp 之间的元素将在其上方和下方具有索引。有两件事需要注意。
- 从阵列的任一端掉落。
- 重复的时间戳。
如果your_timestamp
是数组中的第一个或最后一个元素,则不会有一个索引紧接在第一个下方或紧接在最后一个上方的元素。
如果您的数组包含重复的时间戳,您可能会your_timestamp
作为其中一个值返回。似乎您不想这样做,但这里没有严格的正确或错误答案。它取决于应用程序。
如果您不知道 是否在your_timestamp
数组中,或者您不想your_timestamp
作为其中一个值(除非它是排序数组的第一个或最后一个元素),那么这可能是一种更好的方法。
timestamp_array.sort.each_cons(2){ |ts|
# If your desired timestamp is in the timestamp array, you'll
# get at least two pairs of timestamps.
answer.concat ts if your_desired_timestamp.between?(ts[0], ts[1])
}
# If you have more than 2 elements, return only the first and last element.
if answer.length > 2
answer = answer.first, answer.last
end
p answer
["2013-07-27 18:29:00.132601", "2013-07-27 19:29:00.273857"]
这适用于重复的时间戳,并且没有从数组的任何一端脱落的危险。
一些优化是可用的。例如,您可以切换到二进制搜索(bsearch 方法),如果您有非常大的数组,这可能是值得的;你可以消除条件if answer.length > 2
;等等