2017-05-05 61 views
0

我有阵列像这样的哈希:如何从哈希的值的所有可能的组合

{a: [1, 2], b: [3, 4]} 

我试图建立一个阵列,从不同的键值对值的所有可能的组合,每个,在下面的形式:

[{a: 1, b: 3}, {a: 1, b: 4}, {a: 2, b: 3}, {a: 2, b: 4}] 

散列可以具有n密钥并且每个可以具有m值 - 我不能呈现任意数量。每个值(数组)可以有不同的大小。下面也是一个有效的输入:

{a: [1, 2, 3], b: [4, 5, 6, 7], c: [8, 9, 10, 11, 12]} 

我与所有的价值排列,但没有按键阵列中的最佳:

a = {a:[1, 2, 3], b: [4, 5, 6], c: [7, 8, 9]} 
a.reduce([]) { |acc, (k, v)| acc.empty? ? v : acc.product(v) }.map(&:flatten) 
=> [[1, 4, 7], [1, 4, 8], [1, 4, 9], [1, 5, 7], [1, 5, 8], [1, 5, 9], [1, 6, 7], [1, 6, 8], [1, 6, 9], [2, 4, 7], [2, 4, 8], [2, 4, 9], [2, 5, 7], [2, 5, 8], [2, 5, 9], [2, 6, 7], [2, 6, 8], [2, 6, 9], [3, 4, 7], [3, 4, 8], [3, 4, 9], [3, 5, 7], [3, 5, 8], [3, 5, 9], [3, 6, 7], [3, 6, 8], [3, 6, 9]] 

我应该怎么做这在Ruby中?

+0

每个键的数组长度是否相同? –

+0

@ Md.FhanhanMemon不,它可以变化。 – pmichna

+0

如果'h'是你的散列,这个问题是关于数组'h.values'。也就是说,这个问题实际上是关于数组的,但是它们是获得的。 –

回答

1

基本计划:

从包含空散列的数组开始。

每个键 - 值对:将每个哈希数组映射到每个值为hash.merge({key=> value})的数组。拼合

重复每个键

hash = {a: [1, 2], b: [3, 4]} 
array = [{}] 
hash.each_pair do |key, values| 
    array.map! do |hash| 
    values.map do |value| 
     hash.merge({key=> value}) 
    end 
    end.flatten! 
end 

array 
=> [{:a=>1, :b=>3}, {:a=>1, :b=>4}, {:a=>2, :b=>3}, {:a=>2, :b=>4}] 

可以清理具备更好的代码和枚举方法的使用,但应该是你的总体思路。

+0

谢谢!一个语法错误:它应该是'hash.merge({key => value})'。 – pmichna

+0

哦,是的,当我跑了它,我遇到了这个问题,但我想我粘贴旧代码。 –

2
a = { a: [1, 2], b: [3, 4], c: [5, 6] } 
values = a.values 
values.first.product(*values[1..-1]).map { |e| a.keys.zip(e).to_h } 
#=> [{:a=>1, :b=>3, :c=>5}, {:a=>1, :b=>3, :c=>6}, 
# {:a=>1, :b=>4, :c=>5}, {:a=>1, :b=>4, :c=>6}, 
# {:a=>2, :b=>3, :c=>5}, {:a=>2, :b=>3, :c=>6}, 
# {:a=>2, :b=>4, :c=>5}, {:a=>2, :b=>4, :c=>6}] 

适用于具有任意键数的散列。