1

更新:最後に可能な解決策ですが、確かにパフォーマンスや理想的ではありません。

私が望むものに近い次のメソッドを作成しました。

def multi_permutations(collection)
  case collection.length
  when 1
    return collection.shift[1]
  when 0
    raise "You must pass in a multidimensional collection."
  end

  a = collection.shift[1]
  b = multi_permutations(collection)

  return_value = []
  a.each do |a_value|
    b.each do |b_value|
      return_value << [a_value] + [b_value]
    end
  end

  return return_value
end

このようにネストされた配列を持つハッシュを渡すと...

my_collection["item_9"]   = [152]
my_collection["item_2"]   = [139, 143, 145]
my_collection["item_13"]  = [138, 142, 150]
my_collection["item_72"]  = [137, 149, 151, 154]
my_collection["item_125"] = [140, 141]
my_collection["item_10"]  = [144, 146, 147, 148, 153]

このようなすべての順列を持つハッシュの配列を作成したい...

[{ "item_9": 152 }, { "item_2": 139 }, { "item_13": 138 }, { "item_72": 137 }, { "item_125": 140 }, { "item_10": 144 }]
[{ "item_9": 152 }, { "item_2": 139 }, { "item_13": 138 }, { "item_72": 137 }, { "item_125": 140 }, { "item_10": 146 }]
[{ "item_9": 152 }, { "item_2": 139 }, { "item_13": 138 }, { "item_72": 137 }, { "item_125": 140 }, { "item_10": 147 }]
[{ "item_9": 152 }, { "item_2": 139 }, { "item_13": 138 }, { "item_72": 137 }, { "item_125": 140 }, { "item_10": 148 }]
[{ "item_9": 152 }, { "item_2": 139 }, { "item_13": 138 }, { "item_72": 137 }, { "item_125": 140 }, { "item_10": 153 }]
.
.
.
[{ "item_9": 152 }, { "item_2": 145 }, { "item_13": 150 }, { "item_72": 154 }, { "item_125": 141 }, { "item_10": 144 }]
[{ "item_9": 152 }, { "item_2": 145 }, { "item_13": 150 }, { "item_72": 154 }, { "item_125": 141 }, { "item_10": 146 }]
[{ "item_9": 152 }, { "item_2": 145 }, { "item_13": 150 }, { "item_72": 154 }, { "item_125": 141 }, { "item_10": 147 }]
[{ "item_9": 152 }, { "item_2": 145 }, { "item_13": 150 }, { "item_72": 154 }, { "item_125": 141 }, { "item_10": 148 }]
[{ "item_9": 152 }, { "item_2": 145 }, { "item_13": 150 }, { "item_72": 154 }, { "item_125": 141 }, { "item_10": 153 }]

この関数が最終的に行うことは近いですが、関係が失われます。

[152, [139, [138, [137, [140, 144]]]]]
[152, [139, [138, [137, [140, 146]]]]]
[152, [139, [138, [137, [140, 147]]]]]
[152, [139, [138, [137, [140, 148]]]]]
[152, [139, [138, [137, [140, 153]]]]]
.
.
.
[152, [145, [150, [154, [141, 144]]]]]
[152, [145, [150, [154, [141, 146]]]]]
[152, [145, [150, [154, [141, 147]]]]]
[152, [145, [150, [154, [141, 148]]]]]
[152, [145, [150, [154, [141, 153]]]]]

関係は私にとって非常に重要です。その理由は、属性がハッシュのキーであるオブジェクトをハイドレートすることを計画しているためです。これはより良い方法で行うことができると確信しており、提案を受け付けています。

したがって、私が思いついた解決策の 1 つは、キー配列を作成し、順列を平坦化し、それらをハッシュに圧縮することです。

  results = []
  permutations = multi_permutations(possibilities)
  permutations.each do |permutation|
    results << Hash[keys.zip permutation.flatten!]
  end

これは私に与えることになります...

{"item_9"=>152, "item_2"=>145, "item_13"=>150, "item_72"=>154, "item_125"=>141, "item_10"=>146}
{"item_9"=>152, "item_2"=>145, "item_13"=>150, "item_72"=>154, "item_125"=>141, "item_10"=>147}
{"item_9"=>152, "item_2"=>145, "item_13"=>150, "item_72"=>154, "item_125"=>141, "item_10"=>148}
{"item_9"=>152, "item_2"=>145, "item_13"=>150, "item_72"=>154, "item_125"=>141, "item_10"=>153}
4

1 に答える 1

0

ソリューションの呼び出し方法が提供されていないため、ソリューションを実行できなかったため、効率を比較できませんでした。

このソリューションについてどう思いますか? (単一の引数は、あなたのように、配列のハッシュでなければなりませんmy_collection)

my_collection = {}
my_collection["item_9"]   = [152]
my_collection["item_2"]   = [139, 143, 145]
my_collection["item_13"]  = [138, 142, 150]
my_collection["item_72"]  = [137, 149, 151, 154]
my_collection["item_125"] = [140, 141]
my_collection["item_10"]  = [144, 146, 147, 148, 153]

def permutations!(input)
  input.each do |key, possibilities|
    possibilities.map!{|p| {key => p} }
  end

  digits = input.keys.map!{|key| input[key] }

  digits.shift.product(*digits)
end

results = permutations!(my_collection)

このメソッドは、使用法のために入力オブジェクトを変更することに注意してくださいmap!

于 2012-11-08T08:35:32.477 に答える