删除重复的数组元素

时间:2015-03-26 10:05:54

标签: ruby

[[1,2],[2,1],[8,9],[12,12]]中,前两个元素是相同的。我希望得到这样的输出:[[8,9],[12,12]]

在:

[1,2,3].product([1,2,3])
# => [[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]]

我想获得这样的输出:

[[1, 1], [2, 2], [3, 3]]

2 个答案:

答案 0 :(得分: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]]

答案 1 :(得分: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]]