比较范围数组中的元素

时间:2014-12-22 08:36:56

标签: ruby data-structures

所以假设我有这个范围数组:

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

如何比较具有相同最小值的范围,如果最大值大于另一个,则删除该元素?

3 个答案:

答案 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中是否有类似的东西。由于问题标记为“数据结构”,希望我的回答能够传播出一些亮点。

对于您的情况,您可以将较低范围视为键,将较高​​范围视为值。如果在较低范围内发生碰撞,您可以轻松识别并比较碰撞记录的值,并在必要时删除一个。