2014-12-22 119 views
0

的陣列相比元素,以便考慮到我有這個數組範圍:內範圍

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

有幾種方法可以使用。一種是在範圍的開始處「group_by」,然後爲每個組保持結束值最小的範圍。另一個是'sort_by''[r.first,-r.last]',然後將這些值合併到最初爲空的散列中。 –

+0

我決定提供一個答案,實現了我上面建議的兩種方法。 –

回答

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) } 
+0

解決方案#2。效果很好。謝謝 – yretuta

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 
0

如果有多重映射數據結構,我們可以很容易地處理這種情況。這是一個使用二叉樹的哈希實現,元素按鍵排序。它允許重複的鍵。它在C++中,不知道Ruby中是否有類似的東西。由於問號標籤的'數據結構'希望我的答案傳播一些燈。

對於您的情況,您可以將低範圍視爲鍵和高範圍值。如果在較低範圍內發生碰撞,您可以輕鬆識別並比較碰撞記錄的值並在必要時刪除。