2017-01-13 4 views
0

Я использую Ruby 2.4. У меня есть массив строк, которые сами являются числами. Так что-то вродеКак проверить, что каждый элемент в массиве больше, чем тот, который перед ним?

["1", "2", "3", "5"] 

Как проверить, что целочисленная версию каждого элемента в массиве (кроме первого) больше, чем до этого? Так, например, функция выполняется на вышесказанном будет возвращена истина, а массив как

["1", "5", "4", "6"] 

вернет ложь (потому что «4» не больше «5».

ответ

3

Альтернативный способ фразы ваш предикат: «Для всехпротив ecutive парой чисел, это правда, что второй является больше первыми»? Это можно почти прямо выражать в коде:

ary.map(&:to_i).each_cons(2).all? {|first, second| second > first } 

Кстати, это свойство называется «строгой монотонностью».

+0

Я предпочитаю это, потому что гораздо более очевидно, что делает код. –

+1

Он также должен быть намного быстрее. –

+0

Спасибо, я забыл, для чего стоит 'each_cons'. –

4

Вы можете использовать Enumerable#sort_by, чтобы увидеть если arr уже отсортированы по численному значению:..

arr = ["1", "2", "3", "5"] 
arr.uniq.sort_by(&:to_i) == arr 
#=> true 

Если элементы не являются уникальными, то массив не удается автоматически Поскольку это означает, что два элемента имеют одинаковое значение т.е. один не больше, чем другие

+0

К сожалению, я не могу гарантировать, что элементы будут уникальными, только чтобы все они были цифрами (замаскированными под строки). –

+0

@Natalia не имеет значения, просто обновил свой ответ. –

+0

@Natalia. Если они находятся в порядке от наименьшего до наивысшего, что они должны соответствовать вашему определению «больше, чем до него», то оно сортируется, сортировка эрго не должно иметь никакого эффекта. – tadman

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