我如何简单地使用以下代码,它接受日期数组并返回日期范围数组:
def get_ranges(dates)
sets = []
current_set = []
dates.each do |date|
if current_set.empty?
current_set << date
else
if current_set.last == date - 1.day
current_set << date
else
sets << current_set
current_set = [date]
end
end
sets << current_set if date == dates.last
end
sets.collect { |set| set.first..set.last }
end
运行以下内容:
dates = [Date.new(2014, 6, 27), Date.new(2014, 6, 28), Date.new(2014, 6, 29), Date.new(2014, 7, 1), Date.new(2014, 7, 3), Date.new(2014, 7, 4), Date.new(2014, 7, 17)]
puts get_ranges(dates)
产生以下结果:
=> [Fri, 27 Jun 2014..Sun, 29 Jun 2014, Tue, 01 Jul 2014..Tue, 01 Jul 2014, Thu, 03 Jul 2014..Fri, 04 Jul 2014, Thu, 17 Jul 2014..Thu, 17 Jul 2014]
非常感谢帮助。
更新
基本上,结果应该是连续日期范围的数组。
答案 0 :(得分:1)
你的结果看起来有点奇怪;有些范围可以自己开始和结束。如果您尝试生成一个范围数组,其中每个范围以索引i处的元素开头,并以索引i + 1处的元素结束,这将执行此操作:
dates.each_cons(2).map { |dates| (dates[0]..dates[1]) }
答案 1 :(得分:0)
这应该有效:
sets = []
current = []
dates.each do |date|
if current.empty? || date - current.last == 1
current << date
else
sets << current.first..current.last
current = [date]
end
end
sets << current.first..current.last
这与你的代码基本相同,但是更清洁......