如何在Ruby中循环遍历多个数组?

时间:2014-11-01 07:23:29

标签: ruby-on-rails ruby

我是Ruby新手。我正在创建一个rails平台,我遇到了以下问题: 我有我的第一个数组,为了简单起见,我把'资本'称为: capital = [A,B,C,D]。我有第二个数组small = [a,b,c,d]small的元素与capital的元素有多对一的关系,如:

capital 
has_many:small

这两个表通过我的数据库中的两个表链接,因此可以通过

打印这些数组的有效组合
capital.each do |x|
     small.each do |y|
        puts x,y
     end
end

打印出数据库中定义的x,y的有效组合。这完全没问题。

现在,问题出现了:我有第三个数组array_3,其中包含capitalsmall元素的某些组合,如:

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

我想打印数据库中定义的capitalsmall元素的所有有效组合,以便array_3中不存在该组合。我该怎么做呢?

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 :(得分:1)

你可以这样做

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

答案 2 :(得分:1)

此处适用于capital

中存在的smallarray_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的新手。 ;)