Рубин: округлить число до ближайшего числа на основе произвольного списка чисел - PullRequest
9 голосов
/ 01 июля 2010

скажем, у меня есть массив целых чисел:

arr = [0,5,7,8,11,16]

и у меня есть другое целое число:

n = 6

Мне нужна функция, которая округляет до ближайшего числа из массива:

foo(n) #=> 5

Как видите, цифры не имеют фиксированного шаблона. Какой элегантный способ сделать это?

Спасибо

Ответы [ 2 ]

15 голосов
/ 01 июля 2010

Использование select, за которым следует max:

arr = [0,5,7,8,11,16]
puts arr.select{|item| item < 6}.max

Результат:

5

Это выполняется за линейное время и не требует сортировки массива.

1 голос
/ 01 июля 2010

Если вы используете относительно небольшие массивы (и поэтому не слишком беспокоитесь об эффективности), то это должно работать нормально:

def down_to_array num, arr
  arr.select{|y| y < num}.sort_by{|z| num-z }.first
end

Например:

myarr = [0,5,7,8,11,16]
puts down_to_array 6.5, myarr #=> 5
...