我有这样的数组哈希:
ÌndexSearcher
我尝试使用以下形式构建一个包含所有可能值组合的数组,每个值来自不同的键值对:
{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]}
我应该如何在Ruby中执行此操作?
答案 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}]
使用任何键计数的哈希值。
答案 1 :(得分: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}]
可以使用更好的代码和可枚举方法的使用来清理,但这应该是您的一般想法。
答案 2 :(得分:0)
这取决于n
,m
的值。如果这些常量具有 small 值-您可以制作,存储和使用实际的组合。当这些常量具有大值时,则无法执行该操作。
请尝试使用OCG选项组合生成器。它不会存储任何组合,它可以用作单向迭代器。它可以处理数十亿种不同的组合。
require "ocg"
generator = OCG.new(
a: 1..3,
b: 4..7,
c: 8..12
)
puts generator.next until generator.finished?
Generator包含更多功能,可帮助您处理其他选项。