数组的笛卡尔积,在Ruby中没有重复

时间:2012-06-07 00:30:21

标签: ruby arrays cartesian-product

如何在不包含[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

但这感觉太迫切而不是功能。

1 个答案:

答案 0 :(得分:6)

它被称为combination

a = %w{a b c}

a.combination(2).to_a
=> [["a", "b"], ["a", "c"], ["b", "c"]]