我正在执行一些日期时间计算,其中我必须根据有序日期时间哈希数组计算新的小时组。例如,如果这是初始数组(我已经简化了值,但是可以比较):
[
{first: 9, last: 9.30},
{first: 9.30, last: 10},
{first: 10, last: 10.30},
{first: 12.30, last: 13},
{first: 14, last: 14.30},
{first: 14.30, last: 16.30},
{first: 16.30, last: 18.30},
]
结果应为
[
{first: 9, last: 10.30},
{first: 12.30, last: 13},
{first: 14, last: 18.30}
]
在第一个/最后一个未连接或有多个组的情况下,它也可以用于其他情况。
我的解决方案是使用each_cons(2)
,我每2个检查一次组,但是在某些情况下不起作用。
谢谢
答案 0 :(得分:2)
这适用于您将范围按first
进行排序的情况:
new_ranges = ranges.each_with_object([]) do |range, new_ranges|
if new_ranges.empty? || new_ranges.last[:last] < range[:first]
new_ranges << range
elsif new_ranges.last[:last] < range[:last]
new_ranges.last[:last] = range[:last]
end
end
答案 1 :(得分:1)
这是Enumerable#slice_when的工作,必须对数组进行排序。
array.slice_when { |a, b| a[:last] != b[:first] }.map{ |e| {first: e.first[:first], last: e.last[:last]} }
#=> [{:first=>9, :last=>10.3}, {:first=>12.3, :last=>13}, {:first=>14, :last=>18.3}]
array.chunk_while { |a, b| a[:last] == b[:first] }