ruby 从多个数组生成值的组合

ddrv8njm  于 2023-04-29  发布在  Ruby
关注(0)|答案(2)|浏览(121)

我有四个等长的数组:

a = [1, 2, 3, 4, 5]
b = ['A', 'B', 'C', 'D', 'E']
c = ['J', 'K', 'L', 'M', 'N']
d = ['v', 'w', 'x', 'y', 'z']

我想从每个数组中取一个元素,得到一个包含所有可能组合的数组:

[
  [1, 'A', 'J', 'v'], 
  [2, 'A', 'J', 'v'], 
  [3, 'A', 'J', 'v'],
  ...
]

我在做这个:

master_array = []

for i in first_names do
    sub_array = []
    for j in last_names do
        for k in city do
            for l in state do
                sub_array.push(i, j, k, l)
            end
        end
    end
    master_array.push(sub_array)
end

master_array

理想情况下,我希望返回一个哈希数组,其键是数组的名称,如下所示:

[
  {a: 1, b: 'A', c: 'J', d: 'v'}, 
  {a: 2, b: 'A', c: 'J', d: 'v'}, 
  {a: 3, b: 'A', c: 'J', d: 'v'},
  ...
]
ufj5ltwl

ufj5ltwl1#

使用Array#product,就像@sagarpandya建议的那样。

def get_em_all(a, *arr)
  a.product(*arr)
end
get_em_all(a, b, c, d)
  # => [[1, "A", "J", "v"], [1, "A", "J", "w"], [1, "A", "J", "x"], [1, "A", "J", "y"],
  #     [1, "A", "J", "z"], [1, "A", "K", "v"], [1, "A", "K", "w"], [1, "A", "K", "x"],
  #     ...
  #     [5, "E", "N", "w"], [5, "E", "N", "x"], [5, "E", "N", "y"], [5, "E", "N", "z"]]

get_em_all(a, b, c, d).size
  #=> 625 (= 5**4)

请注意,如果get_em_all的参数被更改为其他东西--8个3元素数组,例如-----则不需要更改方法。
对象(如数组)不知道保存它们的变量。例如,考虑一下

a = [1,2,3]
b = a
  #=> [1, 2, 3]
a.object_id
  #=> 4303360
b.object_id
  #=> 4303360

变量a和变量b都是同一个对象,数组[1,2,3]
因此,要获得你想要的哈希数组,你必须在编译时使用文字键来构造它,并硬连接到四个数组abck。此外,没有理由使用变量名作为哈希的键。这在几个层面上都是糟糕的编程实践。

7vux5j2d

7vux5j2d2#

如果你想要所有可能的组合,除了遍历所有数组的每个元素之外别无选择。
创建哈希也不难。
试试这个

a = [1, 2, 3, 4, 5]
b = ['A', 'B', 'C', 'D', 'E']
c = ['J', 'K', 'L', 'M', 'N']
d = ['v', 'w', 'x', 'y', 'z']

result = []

a.each do |a_elem|
  b.each do |b_elem|
    c.each do |c_elem|
      d.each do |d_elem|
        result << {a: a_elem, b: b_elem, c: c_elem, d: d_elem}
      end
    end
  end
end

puts "#{result}"

我相信这就是你要找的。

相关问题