2

[object i, object j]と の両方を含めずに、配列のデカルト積をそれ自体で行うにはどうすればよい[object j, object i]ですか?

現在、私は持っています

array = %w{a b c}
unique_combinations = array.each_with_index.to_a.product(array.each_with_index.to_a).
  find_all{|(first_object, i), (second_object, j)| i < j}.
  map{|(first_object, i), (second_object, j)| [first_object, second_object]}
unique_combinations # => [["a", "b"], ["a", "c"], ["b", "c"]]

これは機能しますが、少し冗長に感じます。

私はそれをできた

array = %w{a b c}
combinations = array.product(array)
unique_combinations = combinations.find_all{|first_item, second_item| array.index(first_item) < array.index(second_item)}

しかし、それは私が情報を捨てているように感じ、配列に一意のアイテムしかない場合にのみ機能します。

別のアプローチは

unique_combinations = []
array.each_with_index do |first_item, i|
  array.each_with_index do |second_item, j|
    next unless i < j
    unique_combinations << [first_item, second_item]
  end
end

しかし、それは機能的ではなく、あまりにも不可欠です。

4

1 に答える 1

6

コンビネーションといいますか?

a = %w{a b c}

a.combination(2).to_a
=> [["a", "b"], ["a", "c"], ["b", "c"]]
于 2012-06-07T01:44:52.740 に答える