2016-08-20 3 views
0
[ 1, 1, 3, 5 ] & [ 1, 2, 3 ]     #=> [ 1, 3 ] 
[ 'a', 'b', 'b', 'z' ] & [ 'a', 'b', 'c' ] #=> [ 'a', 'b' ] 

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

Так что массив может выглядеть следующим образом ->

a = [[1, 2, 3], [3, 4, 5], [4, 5, 6]] 

Результат должен выглядеть ->

a = [[3],[3,4,5][4,5]] 

Любые предложения?

+0

Можете добавить пример вашего ожидаемого результата? – slowjack2k

+0

Вы все равно должны предоставить пример для других, рассматривающих эту проблему. Я дал решение, но это было сделано, получив обоснованное предположение. – hirolau

+0

данных - >> 'а = [[1, 2, 3], [3, 4, 5], [4, 5, 6]]' Экстракция с помощью пересечения (ожидаемый результат) - >> ' a = [[3], [3,4,5] [4,5]] ' вот что мне нужно. – mminski

ответ

2

Посмотрите на комбинированный метод.

a = [[1, 2, 3], [3, 4, 5], [4, 5, 6],[1,"a","b"]] 

p a.combination(2).map{|x,y| x & y } #=> [[3], [], [1], [4, 5], [], []] 

И если вы не хотите, пустые массивы в там:

p a.combination(2).map{|x,y| x & y }.reject(&:empty?) #=> [[3], [1], [4, 5]] 

Edit: После просмотра некоторые примеры того, что ОП на самом деле хотите вот как я бы добиться желаемого результата:

original = [[1, 2, 3], [3, 4, 5], [4, 5, 6]] 

def intersect_with_rest(array) 
    array.size.times.map do 
    first, *rest = array 
    array.rotate! 
    first & rest.flatten 
    end 
end 

p intersect_with_rest(original) #=> [[3], [3, 4, 5], [4, 5]] 
p original #=> [[1, 2, 3], [3, 4, 5], [4, 5, 6]] 

Или:

original = [[1, 2, 3], [3, 4, 5], [4, 5, 6]] 

result = original.map.with_index do |x,i| 
    x & (original[0...i]+original[1+i..-1]).flatten 
end 

p result #=> [[3], [3, 4, 5], [4, 5]] 
0

Да, наконец, я нашел решение. Может быть, есть более простой способ, но это работает для меня сейчас ..

c = [[1,2,3],[3,4,5],[4,5,6]] 
results = [];c.length.times.each {|e| results.push c.rotate(e).combination(2).map {|x, y| x & y}} 
results.map{|x, y| y + x} 

=> [[3], [3, 4, 5], [4, 5]] 

Благодаря @hirolau за подсказку. С наилучшими пожеланиями

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