2011-09-07 24 views
1

比方说,我有一个min和一个max号码。 max可以是任何东西,但min将始终大于零。有没有办法找出一个数字在红宝石范围内的位置?

我可以得到范围min..max并且假设我有第三个数字count - 我想将范围除以10(或其他数字)以获得新的比例。所以,如果范围是1000,它会增加100,200,300的值,并根据我的新比例找出计数在范围内的位置。所以,如果count是235,它将返回2,因为那是它在范围尺度上的位置。

我有什么意义吗?我试图创建一个基于一系列值的热图,基本上......所以我需要根据范围创建比例,并找出我测试的值位于该新比例的位置。

我用这样的工作,但它并没有做到这一点:

def heat_map(project, word_count, division) 
    unless word_count == 0 
     max = project.words.maximum('quantity') 
     min = project.words.minimum('quantity') 
     range = min..max 
     total = range.count 
     break_point = total/division 
     heat_index = total.to_f/word_count.to_f 
     heat_index.round 
    else 
     "freezing" 
    end 
    end 

我想有可能是一个更简单的红宝石办法,我失踪。

+0

是你想直方图的概念? –

+0

是的,非常相似。 – Slick23

回答

4

为什么不使用算术和舍入?假设numberminmax之间,并且希望的范围内分割成n_div分裂和x是要查找的索引数(根据上面它看起来像min = 0max = 1000,n_div = 10,和x = 235):

def heat_index(x, min, max, n_div) 
    break_point = (max - min).to_f/n_div.to_f 
    heat_index = (((x - min).to_f)/break_point).to_i 
end 

然后heat_index(235, 0, 1000, 10)给人2.

+0

这是最简单的解决方案......当我发布时,我正在朝着这个方向努力。如果min不是0,它会保持不变吗? – Slick23

+0

是的,只要min dantswain

1

这是怎么回事?它会生成一系列范围边界,然后检查数字是否位于它们之间。

def find_range(min, max, query, increment) 
    values = [] 
    (min..max).step(increment) { |value| values << value } 
    values.each_with_index do |value, index| 
    break if values[index + 1].nil? 
    if query > value && query < values[index + 1] 
     return index 
    end 
    end 
end 

编辑:去除多余的变量

+0

这似乎工作,使用索引号是个好主意......但是,我从来没有真正理解'<<'运算符或者它究竟在做什么。 – Slick23

+0

'<<'为数组添加一个元素。所以'myarray = []; myarray <<“string”'产生'[“string”]''。 – djb

+0

此外,该范围变量实际上是多余的,你可以放弃它,只是从内部返回索引'if' – djb

4

我只是很快集思广益的想法,但会是这样的帮助呢?

>> (1..100).each_slice(10).to_a.index { |subrange| subrange.include? 34 } 
=> 3 
>> (1..100).each_slice(5).to_a.index { |subrange| subrange.include? 34 } 
=> 6 

这告诉你在小范围(子范围大小是由参数确定each_slice)的值(参数subrange.include?)所在。

>> (1..1000).each_slice(100).to_a.index { |subrange| subrange.include? 235 } 
=> 2 

注意,对于子范围的索引从0开始的,所以你可能要1添加到他们这取决于你所需要的。此外,这还没有准备好,但应该很容易在方法中结束。