2015-10-03 4 views

ответ

4
[[1, 2, 3, 4], [3, 4, 5, 6], [4, 5, 6, 8]].reduce(:&) # => [4] 

Метод Array#& дает пересечение множеств:

[1, 2, 3] & [2, 3, 4] # => [2, 3] 

Метод Enumerable#reduce может объединить значения в данном массиве, используя операцию:

[1, 2, 3].reduce(:+) # => 6 
0

Вот еще один способ сделать это «вручную lol» ... Вы делаете каждый для повторения над вложенными массивами [[0],[1],[2]],, тогда вы перебираете каждый вложенный массив и используете include ary [pos] .include? (X) с AND между всеми тремя вложенными массивами, чтобы найти пересекающееся значение, оно будет медленным, но удобным, если вы хотите добавить дополнительные условия.

user> ary = [ [1,2,3,4], [3,4,5,6], [4,5,6,8] ] 
=> [[1, 2, 3, 4], [3, 4, 5, 6], [4, 5, 6, 8]] 

user> ary.each { |f| f.each {|x| 
       puts "#{x}" if ary[0].include?(x) && ary[1].include?(x) && 
       ary[2].include?(x) }} 
4 
4 
4 

или просто

2.1.2 :003 > ary = [ [1,2,3,4], [3,4,5,6], [4,5,6,8] ].inject(:&) 
=> [4] 
+0

Не писать код, как '[а = [1,2,3,4], B = [3,4,5,6], с = [4,5,6,8]]. Это кошмар для обслуживания и определенно не рекомендуется или идиоматично. –

+1

Я согласен, что оловянный человек, я изменил ответ, чтобы не включать a =, b =, c = blah ... – zee

+0

Теперь попробуйте сделать это, не используя 'include? ' неоднократно. Представьте, что массивы увеличились до 100 раз, а производительность снизилась до обхода. –

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