Как я могу сделать декартово произведение массива с собой, не включая [object i, object j]
и [object j, object i]
?Декартово произведение массива с самим собой без дубликатов в Ruby
В настоящее время я получил
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
но чувствует себя слишком важно, а не функциональным.