Ruby's Enumerable.chunk
полезно здесь.Я сократил диапазоны, проверяемые для простоты, и добавил дополнительный диапазон, который был не в порядке, чтобы показать, что он обрабатывает диапазоны вне порядка:
require 'date'
date_ranges = [
'01 Jan 2011', '03 Jan 2011',
'02 Jan 2011', '04 Jan 2011',
'02 Mar 2011', '03 Mar 2011',
'01 Jan 2000', '02 Jan 2000'
].each_slice(2).map{ |dates|
Range.new(
*dates.map{ |d|
Date.parse(d)
}
)
}
gaps = date_ranges
.inject([]){ |a, d| a |= d.to_a } # accumulate the unique dates in the ranges
.sort # sort to get them in ascending order
.each_with_index # add an offset into the order
.chunk{ |d,i| d - i } # group by the delta
.to_a[1 .. -1] # grab all but the first group
.map{ |g,dates| dates.first.first } # strip off the groups and indexes
puts gaps
Выходы:
2011-01-01
2011-03-02
Поскольку я добавил диапазон вне ордера, исходный начальный диапазон теперь является пробелом, как и дата 02 марта 2011 года.
Это даст вам пример того, что делает chunk
:
[1,2,3,4,5].each_with_index.chunk{ |n,i| n-i }.to_a # => [[1, [[1, 0], [2, 1], [3, 2], [4, 3], [5, 4]]]]
[1,2, 4,5].each_with_index.chunk{ |n,i| n-i }.to_a # => [[1, [[1, 0], [2, 1]]], [2, [[4, 2], [5, 3]]]]