2015-06-24 7 views
3

У меня есть массив со списком чисел, например.Фильтровать массив по номеру?

[10, 30, 50, 54, 56, 95, 97, 99] 

Если я предоставляю номер, например. 52, он должен вернуть следующее самое низкое число в массиве, в этом случае это будет 50.

Какой самый чистый способ сделать это?

Укажите, следует ли сначала отсортировать массив.

+0

Другим способом, это довольно эффективно, хотя немного домашнее: 'n = [10, 54, 50, 30] .min_by {| e | (e <52)? 52-e: 61}; n = nil, если n == 61 # => 50'. –

ответ

9

я бы что-то вроде этого (нет необходимости в сортировка):

[10, 30, 50, 54, 56, 95, 97, 99].select {|n| n < 52}.max 
+0

Nice: эффективен и хорошо читается. –

2

Я думаю, что это может работать для отсортированного массива:

[10, 30, 50, 54, 56, 95, 97, 99].sort.reverse.find { |el| el < number } 

Это просто меняет направление сортировки по убыванию и находит первый элемент меньше

+0

Думаю, что вызов 'sort' будет добавлять значение:' [10, 30, 50, 54, 56, 95, 97, 99] .sort.reverse.find {| el | el vee

+0

Правда. Я обновлю ответ. –

+0

Сортировка стоит дорого. В общем, если вам нужно только самое большое или наименьшее значение, не сортируйте. –

0

Предположив массив сортируется:

ary = [...] 
pivot = 52 
ary.partition{|n| n < pivot}[0][-1] 
+0

'ary.partition {| n | n

0

Вы должны попробовать rindex

ary.sort.rindex {|el| el < number} 

и возвращают первый соответствующий элемент.

1

Другой способ сделать это с отсортированного массива использовать Array#bsearch на реверсе:

[10, 30, 50, 54, 56, 95, 97, 99].reverse.bsearch { |n| n < 52 } # => 50 
1

Использование обнаружить вместо выбора, потому что выбор итерация через все элементы. detect возвращает первое совпадение.

Массив не нужно сортировать.

[10, 30, 50, 54, 56, 95, 97, 99].sort { |a, b| b <=> a }.detect { |v| v <= 52 } 
+0

Массив необходимо сортировать. Вы даже сортируете его в своем ответе! – nesiseka

+0

Да, это то, что я говорю. Входной массив не нужно сортировать, потому что строка, которую я написал, сортирует, прежде чем возвращать самое низкое значение. но я не перебираю весь массив из-за обнаружения. – d34n5

Смежные вопросы