2014-03-24 157 views
-1

我有頂級的對象和左屬性的一個這樣的數組:有多少個對象具有相同的屬性值?

[{top: 30, left: 20}, {top:50, left:10}, {..}] 

我試圖找到多少個對象具有近似的最大價值相同。在這種情況下:

[{top: 10, left: 20}, {top:10, left:10}, {top: 10, left: 123}, 
{top:500, left:10}, {top:2, left: 50}, {top:2, left:400}] 

的方法將返回5因爲有有10作爲TOP值三個對象,並有2作爲TOP值兩個對象。如果有一個對象不與其他任何東西共享其最高值,則不會將其考慮在內。我並不是在尋找確切的數值,而是在數值上有10%的差異,因此{top:10, left:20}{top:10.13, left:20}將被視爲具有相同的最高值。到目前爲止,我有這個:

myarr.group_by { |x| x[:top] }.map { |k,v| [k, v.length] }.to_h 

但這不會考慮到這個邊際誤差。我不確定我會如何改變它以便這樣做。

+1

比方說,你的保證金是'2'(絕對),你有什麼打算用'[10做,11,12,13,14]'? '12 +/- 2'? '10 +/- 2'和'14 +/- 2'? '10'和'13 +/- 2'? –

+0

'10.13'與'10'的10%差距如何? – sawa

回答

0

根據您想如何表達「相似」,你可以做這樣的事情:

def count_similar(a, lower_bound, upper_bound) 
    a.count { |h| h[:top] >= lower_bound && h[:top] <= upper_bound } 
end 

a = [{top: 10, left: 20}, {top:10, left:10}, {top: 10, left: 123}, 
    {top:500, left:10} , {top:2, left: 50}, {top:2, left:400}] 

count_similar(a, 1, 19) #=> 5 
+0

我在思考它們的相似程度。所以,其中一個比另一個大或小,只有10%,可以被認爲是相同的價值。我不能依靠靜態邊界,因爲最高值可能在10000到50之間。我沒有控制權。 – StarTrek18

+0

我不是主張「靜態邊界」。由於您沒有提供「類似」的定義,因此我只是將其作爲計算':top'的值落入範圍內的元素的可能基本結構。你可以做一些其他計算來計算你想要的上限和下限。例如,根據某些標準,可能會在拋出一些您認爲是「異常值」的值之後,將上限值設爲比平均值或中位值高10%。這完全取決於你。 –

相關問題