Рубиновые логические операторы - элементы в одном, но не в обоих массивах - PullRequest
7 голосов
/ 18 января 2012

Допустим, у меня есть два массива:

a = [1,2,3]
b = [1,2]

Я хочу, чтобы логическая операция выполнялась на обоих этих массивах, которая возвращает элементы, которых нет в обоих массивах (т. Е. 3).Спасибо!

Ответы [ 3 ]

14 голосов
/ 18 января 2012

Массивы в Ruby очень удобно перегружают некоторые математические и побитовые операторы.

Элементы, которые находятся в a, но не в b

 a - b # [3]

Элементы, которые находятся в a и b

 a & b # [1, 2]

Элементы, которые находятся в a или b

 a | b # [1, 2, 3]

Сумма массивов (конкатенация)

 a + b # [1, 2, 3, 1, 2]

Вы поняли.

9 голосов
/ 19 января 2012
p (a | b) - (a & b) #=> [3]

Или используйте наборы

require 'set'
a.to_set ^ b
1 голос
/ 18 марта 2016

Существует третий способ взглянуть на это решение, которое напрямую отвечает на вопрос и не требует использования наборов:

r = (a-b) | (b-a)

(ab) даст вам то, что находится в массиве a, но неb:

a-b
=> [3] 

(ba) даст вам то, что находится в массиве b, но не a:

b-a 
=> [] 

ИЛИ вычитание двух массивов даст вам окончательный результат всего, чтоотсутствует в обоих массивах:

r = ab | ba
=> [3]

Другой пример может сделать это еще более ясным:

a = [1,2,3]
=> [1, 2, 3] 

b = [2,3,4]
=> [2, 3, 4] 

a-b
=> [1] 

b-a
=> [4] 

r = (a-b) | (b-a)
=> [1, 4] 
...