Ruby数组计算,对已连接项和未连接项进行分组

时间:2019-02-25 11:34:19

标签: arrays ruby algorithm

我正在执行一些日期时间计算,其中我必须根据有序日期时间哈希数组计算新的小时组。例如,如果这是初始数组(我已经简化了值,但是可以比较):

[
  {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个检查一次组,但是在某些情况下不起作用。

谢谢

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}]


Enumerable#chunk_while的作用相同:

array.chunk_while { |a, b| a[:last] == b[:first] }