rails - Пошук перетинів між кількома масивами


75

Я намагаюся знайти значення перетину між кількома масивами.

наприклад

code1 = [1,2,3]
code2 = [2,3,4]
code3 = [0,2,6]

Отже, результат буде 2

Я знаю, що в PHP це можна зробити за допомогою array_intersect

Я хотів мати можливість легко додати додатковий масив, тому я не дуже хочу використовувати кілька циклів

Будь-які ідеї?

Дякую, Алекс

Відповіді:


118

Використовуйте метод & Array, який призначений для набору перетину.

Наприклад:

> [1,2,3] & [2,3,4] & [0,2,6]
=> [2]

@Anurag Ви впевнені, що це працює? Якщо я не неправильно розумію вимоги OP, перший і останній масиви не перевіряються на перетин між собою. Наприклад, [1,2,3] & [4,5,6] & [1,2,3]повертає порожній масив.
Ноз

2
@Cyle будь-який елемент в результаті тристороннього перетину повинен існувати у всіх трьох операндах. Дивіться en.wikipedia.org/wiki/Intersection_(set_theory)

50

Якщо вам потрібен простіший спосіб зробити це з масивом масивів невідомої довжини, ви можете використовувати ін’єкцію.

> arrays = [code1,code2,code3]
> arrays.inject(:&)                   # Ruby 1.9 shorthand
=> [2]
> arrays.inject{|codes,x| codes & x } # Full syntax works with 1.8 and 1.9
=> [2]

arrays.inject(:&)не працюватиме в 1.9. це все arrays.inject(:'&')
одно

0

Перетин масиву # (Ruby 2.7+)

Ruby 2.7 представив метод перетину Array #, щоб відповідати більш стислому Array # & .

Отже, тепер [1, 2, 3] & [2, 3, 4] & [0, 2, 6]це можна переписати більш багатослівно, наприклад

[1, 2, 3].intersection([2, 3, 4]).intersection([0, 2, 6])
# => [2]

[1, 2, 3].intersection([2, 3, 4], [0, 2, 6])
# => [2]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.