2015-03-26 4 views

ответ

2

Чтобы получить уникальный выход независимо от расположения отдельного массива, выполните следующие действия:

[1,2,3].product([1,2,3]).map(&:sort).uniq 
# => [[1, 1], [1, 2], [1, 3], [2, 2], [2, 3], [3, 3]] 

Если вам требуется выход только с повторяющимися значениями, сделайте следующее:

[1,2,3].product([1,2,3]).map {|k,v| [k,v] if k == v}.compact 
# => [[1, 1], [2, 2], [3, 3]] 
+0

вау! спасибо :) @shivam –

+0

Я не думаю, что это то, что он ищет. Ваш ответ не работает для его первого тестового примера (возвращает '[[12,12]]' вместо '[[8,9], [12,12]]'). – dwenzel

+0

@dwenzel Он уверен, что, пожалуйста, перепроверить. '[[12,12]]' будет возвращен для 2-го случая. 1-й случай возвращает '[[1, 2], [8, 9], [12, 12]]'. Вы можете сказать, что '[1, 2]' дополнительно, но целью здесь является указание OP в правильном направлении. он может легко удалить это, если потребуется. – shivam

1

У Ruby есть метод #uniq, но он удаляет любые дубликаты, но KEEPS один из них. Так что это не будет работать в вашем случае, так как кажется, что вы хотите удалить ВСЕ элементы с дубликатами.

Вот решение, которое должно сделать трюк:

def remove_dups(array) 
    new_array = [] 
    # first, sort each element 
    start_array = array.map{|e| e.sort} 
    start_array.each_with_index do |sub_array, idx| 
    temp_array = start_array.dup 
    temp_array.delete_at(idx) 
    # after deleting the element, check to see if the array still includes the element 
    new_array << sub_array unless temp_array.include?(sub_array) 
    end 
new_array 
end 

p remove_dups([[1,2],[2,1],[8,9],[12,12]]) 
#=> [[8, 9], [12, 12]] 
p remove_dups([1,2,3].product([1,2,3])) 
#=> [[1, 1], [2, 2], [3, 3]]