Дано:
a1 = [5, 1, 6, 14, 2, 8]
Я хотел бы определить, содержит ли он все элементы:
a2 = [2, 6, 15]
В этом случае результат false
.
Существуют ли какие-либо встроенные методы Ruby / Rails для определения такого включения массива?
Один из способов реализовать это:
a2.index{ |x| !a1.include?(x) }.nil?
Есть ли лучший, более читаемый способ?
ruby-on-rails
arrays
ruby
Миша Морошко
источник
источник
Ответы:
источник
(a2-a1).empty?
(a2.uniq - a1.uniq).empty?
Возможно, это легче читать:
Вы также можете использовать пересечение массива:
Обратите внимание, что
size
здесь используется только для скорости, вы также можете сделать (медленнее):Но я думаю, что первое более читабельно. Эти 3 - простые рубины (не рельсы).
источник
Это может быть достигнуто путем
Это создает пересечение обоих массивов, возвращая все элементы из
a2
которых также находятся вa1
. Если результат совпадает сa2
, вы можете быть уверены, что все элементы включены вa1
.Этот подход работает только в том случае, если все элементы в
a2
первую очередь отличаются друг от друга. Если есть двойники, этот подход терпит неудачу. Тот из Tempos все еще работает тогда, поэтому я искренне рекомендую его подход (также он, вероятно, быстрее).источник
length
метода будет работать намного лучшеЕсли дублирующихся элементов нет или их не волнует, вы можете использовать класс Set :
За кулисами это использует
источник
Вы можете сделать мартовский патч для класса Array:
тест
Конечно, метод может быть написан как стандартный метод, например
и вы можете вызвать его как
Действительно, после профилирования следующая версия намного быстрее, а код короче.
источник
В зависимости от размера ваших массивов, вы можете рассмотреть эффективный алгоритм O (n log n)
Сортировка стоит O (n log n), а проверка каждой пары стоит O (n), таким образом, этот алгоритм равен O (n log n). Другие алгоритмы не могут быть быстрее (асимптотически) с использованием несортированных массивов.
источник
Большинство ответов, основанных на (a1 - a2) или (a1 & a2), не сработают, если в любом из этих массивов есть повторяющиеся элементы. Я прибыл сюда в поисках способа проверить, все ли буквы слова (разбитые на массивы) являются частью набора букв (например, для скрэббл). Ни один из этих ответов не сработал, но вот этот:
источник