2014-03-24 124 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%。这完全取决于你。 –

相关问题