2014-11-01 5 views
0

Я новичок в Ruby. Я создаю платформу рельсов, где я столкнулся со следующей проблемой: У меня есть мой первый массив, который для простоты называю «капитал» следующим: capital = [A,B,C,D]. У меня есть второй массив small = [a,b,c,d]. Элементы small имеет много к одному отношениям с элементами capital, как:Как перемещаться по нескольким массивам в Ruby?

capital 
has_many:small 

Эти два связаны между собой через две таблицы в моей базе данных, так что допустимая комбинация этих массивов может быть распечатана

capital.each do |x| 
    small.each do |y| 
     puts x,y 
    end 
end 

, который печатает допустимые комбинации x, y, определенные в базе данных. Это прекрасно работает.

Теперь вот вопрос: у меня есть третий массив array_3, который содержит некоторые комбинации элементов capital и small, как:

array_3 = [(A,c), (C,d), (D,b)]

Я хочу, чтобы напечатать все допустимые комбинации элементов capital и small, как определено в базе данных, так что комбинация отсутствует в array_3. Как мне это сделать?

+0

Не могли бы вы правильно отформатировать вопрос? :-) –

ответ

2
capital = %w(A B C D) 
small = %w(a b c d) 
array_3 = [%w(A c), %w(C d), %w(D b)] 

capital.product(small) - array_3 
#=> [["A", "a"], ["A", "b"], ["A", "d"], ["B", "a"], ["B", "b"], ["B", "c"], ["B", "d"], ["C", "a"], ["C", "b"], ["C", "c"], ["D", "a"], ["D", "c"], ["D", "d"]] 
1

Вы можете сделать как

capital.each do |x| 
    small.each do |y| 
    puts x,y unless array_3.include?([x,y]) 
    end 
end 
+0

У меня есть пост d ответ, изменяя ваше решение для всех комбинаций..bdw 1+ для этого;) –

1

Вот для всех комбинации capital и small, которая существует в array_3

capital.each do |x| 
    small.each do |y| 
    puts "[#{x}, #{y}]" unless array_3.exclude?([x,y]) 
    puts "[#{y}, #{x}]" unless array_3.exclude?([y,x]) 
    end 
end 

Проверьте код в консоли:

> small 
=> ["a", "b", "c", "d"] 
> capital 
=> ["A", "B", "C", "D"] 
> array_3 
=> [["A", "c"], ["C", "d"], ["D", "b"], ["A", "A"], ["C", "C"], ["a", "C"], ["b", "A"]] 

> capital.each do |x| 
> small.each do |y| 
>  puts "[#{x}, #{y}]" unless array_3.exclude?([x,y]) 
>  puts "[#{y}, #{x}]" unless array_3.exclude?([y,x]) 
> end 
> end 

Выход:

=>[b, A]  # [small, capital] 
[A, c]  # [capital, small] 
[a, C]  # [small, capital] 
[C, d]  # [capital, small] 
[D, b]  # [capital, small] 

Примечание: Вы можете использовать if array_3.include? вместо unless array_3.exclude? который будет возвращать один и тот же результат.

Для получения дополнительной информации о exclude? и include?, поскольку вы новичок в Ruby. ;)

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