0

因此,如果我有一个这样的时间戳数组(实际上比这更多):

2013-07-27 18:02:59.865572
2013-07-27 18:29:00.132601
2013-07-27 19:00:00.081585
2013-07-27 19:29:00.273857
2013-07-27 20:00:00.011761

我想找出哪两个时间戳2013-07-27 19:13:00.081585介于两者之间,Ruby 最优雅的方式是什么?

我可以设想一堆丑陋的循环和 if 语句来做到这一点,但作为一个新手 Ruby 程序员,我怀疑有一种更优雅的方式来做到这一点(我绝对找不到!)。

谢谢!

4

2 回答 2

1

这取决于几件事。

  • 您要查找的时间戳是否已知在数组中。
  • 之间是什么意思。
  • 数组中的元素是否唯一。

让我们假设数组已排序,或者您将自己事先对其进行排序。

如果your_timestamp已知在数组中,您可以使用 找到它的索引timestamp_array.index(your_timestamp)。从逻辑上讲,your_timestamp 之间的元素将在其上方和下方具有索引。有两件事需要注意。

  1. 从阵列的任一端掉落。
  2. 重复的时间戳。

如果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;等等

于 2013-07-28T19:10:21.227 回答
0

So someone else left an answer and then redacted it for some reason, I think it was because there was an error, but it led me in the right direction, as did @squiguy.

timestamp_array.sort.each_cons(2).select{ |a,b|  
  puts a
    if a < your_desired_timestamp and b > your_desired_timestamp)
      puts 'this is the valid range for ' + your_desired_timestamp.to_s
    end
  puts b
}

Thanks Guys and Gals!

于 2013-07-27T22:15:03.197 回答