2012-07-13 237 views
11

我需要帮助,看起来很简单,但让我困惑。试图编写一些模糊匹配方法来处理根据需要计算什么值与实际上可从选择列表中获得的格式之间的差异。如何在数组数组中寻找最佳匹配元素?

价值(期权执行价)总是一个计算浮点数,如85.0或Int。

该数组包含字符串形式的数字,在任一增量或它们是否将被显示舍入到一些小数(包括额外的零象5.50)不可预测的或没有小数(如85),例如:

select_list = ["77.5", "80", "82.5", "85", "87.5", "90", "95", "100", "105"] 

我不确定如何编写简单的一行或两行代码,它将返回数组中出现的最接近的匹配元素(按数字值)。例如,如果select_list.contains? 85.0返回"85"

其实,选择选项来自Watir::Webdriver browser.select_list(:id, "lstStrike0_1") HTML对象,其可视文本(而不是HTML值)是这些数字;也许有一种更直接的方法可以直接调用browser.select_list(:id, "lstStrike0_1").select X,而不必在Watir中弄清楚如何将所有这些选择转换为Ruby数组?

+0

另一个问题http://stackoverflow.com/q/6358860/1069375的最佳方式照亮我如何很容易地转换所述的Watir select_list中成所需的数组:'selectContent = browser.select_list(:ID, “lstStrike0_1”)。options.map(&:文本)' – Marcos 2012-07-13 19:42:44

回答

20
xs = ["77.5", "80", "82.5", "85", "87.5", "90", "95", "100", "105"] 
xs.min_by { |x| (x.to_f - 82.4).abs } 
#=> "82.5" 
+0

我看到的最简洁的方式。我的目的,完整的解决方案组合成一条线是'$ browser.select_list(:身份证, “lstStrike0_0”)选择(strikelist = $ browser.select_list(:ID “lstStrike0_0”)options.map(。文) ).min_by {| x | (x.to_f - sigitem [:strikel])。abs}' – Marcos 2012-07-15 07:51:54

5

我不是红宝石编码器所以这可能不是做

def select_closest(list, target)        
    return (list.map {|x| [(x.to_f - target).abs, x]}).min[1] 
end                

select_list = ["77.5", "80", "82.5", "85", "87.5", "90", "95", "100", "105"] 

puts select_closest(select_list, 81) # yields 80 
+0

我电除尘器。就像你考虑了不准确的数字值(81对最接近的80),即使我没有明确提到这一点,但很容易发生。谢谢! – Marcos 2012-07-13 19:36:20

相关问题