所以假设我有这个范围数组:
[
[0] Mon, 29 Dec 2014 07:30:00 PST -08:00..Mon, 29 Dec 2014 10:59:59 PST -08:00,
[1] Mon, 29 Dec 2014 12:30:01 PST -08:00..Mon, 29 Dec 2014 15:00:00 PST -08:00,
[2] Mon, 29 Dec 2014 07:30:00 PST -08:00..Mon, 29 Dec 2014 08:59:59 PST -08:00,
[3] Mon, 29 Dec 2014 10:30:01 PST -08:00..Mon, 29 Dec 2014 15:00:00 PST -08:00
]
如何比较具有相同最小值的范围,如果最大值大于另一个,则删除该元素?
答案 0 :(得分:1)
不可否认,这将是缓慢的:
your_array.group_by do |range|
range.min
end.each do |min_value, ranges|
least_max = ranges.map(&:max).min
ranges.delete_if{ |range| range.max != least_max }
end.values
以下内容可能更快,也会删除原始数组中的内容:
min_maxes = {}
your_array.each do |range|
min = range.min
max = range.max
if min_maxes[min].nil? || (min_maxes[min] > max)
min_maxes[min] = max
end
end
your_array.delete_if do |range|
min_maxes[range.min] < range.max
end
答案 1 :(得分:1)
两种方式,其中a
是范围数组:
<强>#1 强>
a.each_with_object({}) { |r,h| h.update({ r.first=>r }) { |_,ov,nv|
[ov,nv].min_by(&:last) } }.values
<强>#2 强>
a.group_by(&:first).values.map { |r| r.min_by(&:last) }
答案 2 :(得分:0)
如果有多图数据结构,我们可以轻松处理这种情况。它是使用二叉树的哈希实现,元素按键排序。它允许重复键。它存在于C ++中,不确定Ruby中是否有类似的东西。由于问题标记为“数据结构”,希望我的回答能够传播出一些亮点。
对于您的情况,您可以将较低范围视为键,将较高范围视为值。如果在较低范围内发生碰撞,您可以轻松识别并比较碰撞记录的值,并在必要时删除一个。