Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何从散列';s值_Ruby_Algorithm - Fatal编程技术网

Ruby 如何从散列';s值

Ruby 如何从散列';s值,ruby,algorithm,Ruby,Algorithm,我有一个如下的数组散列: {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: [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中实现这一点

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}]
使用具有任意键计数的哈希进行工作。

基本计划:

从包含空哈希的数组开始

每个键值对:将数组中的每个哈希映射到每个值的
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}] 

可以通过更好的代码和使用可枚举方法来清理,但这应该是您的总体想法

它取决于
n
m
值。如果这些常数的值很小,您可以制作、存储和使用实际的组合。当这些常数的值较大时,不可能执行此操作

请尝试选项组合生成器。它不会存储任何组合,它作为单向迭代器工作。它可以处理数十亿种不同的组合

需要“ocg”
发电机=OCG.new(
a:1..3,
b:4..7,
c:8..12
)
将generator.next置于generator.finished之前?

生成器包含更多功能,可帮助您处理其他选项。

每个键的数组长度相同?@Md.FarhanMemon否,它可能会有所不同。如果
h
是您的哈希值,则此问题是关于数组
h.values
。也就是说,问题实际上是关于数组的,不管它们是如何获得的。谢谢!一个语法错误:它应该是
hash.merge({key=>value})
。哦,是的,当我运行它时遇到了这个问题,但我想我粘贴了旧代码。