2012-07-13 122 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