Подтвердить что ты не робот

Как найти наилучший совпадающий элемент в массиве чисел?

Мне нужна помощь с чем-то, что кажется простым, но меня смущает. Попытка написать некоторый метод нечеткого сопоставления, который справляется с различиями в формате между тем, какое значение вычисляется по мере необходимости и которое действительно доступно из списка выбора.

Значение (цена исполнения опциона) всегда является вычисленным значением Float как 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, не указывая в Ватире, как преобразовать все эти варианты в массив Ruby?

4b9b3361

Ответ 1

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"

Ответ 2

Я не рубиновый кодер, поэтому это может быть не лучший способ сделать это

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