gpt4 book ai didi

ruby-on-rails - 如何组合重叠的时间范围(时间范围联合)

转载 作者:数据小太阳 更新时间:2023-10-29 06:31:38 25 4
gpt4 key购买 nike

我有一个包含多个时间范围的数组:

[Tue, 24 May 2011 08:00:00 CEST +02:00..Tue, 24 May 2011 13:00:00 CEST +02:00,
Tue, 24 May 2011 16:30:00 CEST +02:00..Tue, 24 May 2011 18:00:00 CEST +02:00,
Tue, 24 May 2011 08:00:00 CEST +02:00..Tue, 24 May 2011 09:00:00 CEST +02:00,
Tue, 24 May 2011 15:30:00 CEST +02:00..Tue, 24 May 2011 18:00:00 CEST +02:00]

我想获得具有重叠时间范围组合的相同数组,因此这种情况的输出将是:

[Tue, 24 May 2011 08:00:00 CEST +02:00..Tue, 24 May 2011 13:00:00 CEST +02:00,
Tue, 24 May 2011 15:30:00 CEST +02:00..Tue, 24 May 2011 18:00:00 CEST +02:00]

因此,当时间范围重叠时,它会创建一个新的时间范围,依此类推。如果它们不重叠,则将保持分开。另一个例子:

输入:

[Tue, 24 May 2011 08:00:00 CEST +02:00..Tue, 24 May 2011 13:00:00 CEST +02:00,
Tue, 24 May 2011 16:00:00 CEST +02:00..Tue, 24 May 2011 18:00:00 CEST +02:00]

输出(将相同,因为它们不重叠):

[Tue, 24 May 2011 08:00:00 CEST +02:00..Tue, 24 May 2011 13:00:00 CEST +02:00,
Tue, 24 May 2011 16:00:00 CEST +02:00..Tue, 24 May 2011 18:00:00 CEST +02:00]

我正在考虑某种递归方法,但我需要一些指导......

最佳答案

给定一个函数,如果两个范围重叠则返回 truthy:

def ranges_overlap?(a, b)
a.include?(b.begin) || b.include?(a.begin)
end

(此功能由 sepp2k and steenslag 提供)

以及合并两个重叠范围的函数:

def merge_ranges(a, b)
[a.begin, b.begin].min..[a.end, b.end].max
end

然后这个函数,给定一个范围数组,返回一个合并了所有重叠范围的新数组:

def merge_overlapping_ranges(overlapping_ranges)
overlapping_ranges.sort_by(&:begin).inject([]) do |ranges, range|
if !ranges.empty? && ranges_overlap?(ranges.last, range)
ranges[0...-1] + [merge_ranges(ranges.last, range)]
else
ranges + [range]
end
end
end

关于ruby-on-rails - 如何组合重叠的时间范围(时间范围联合),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6017523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com