从嵌套数组中删除重复项

时间:2010-12-31 18:00:47

标签: ruby arrays duplicates

我有一个数组,其中包含特定顺序的数字。我想从嵌套数组中删除重复项,但是有一个层次结构:如果数组出现在数组的较低索引中,请删除数组链中的所有重复项。

实施例: nums = [[10,6,14],[6],[10,6,9],[10,13,6],[10,13,6,9,16],[10,13]] < / p>

nums [0]包含[10,6,14]因此,任何后续提及的10,6,14应该从链中的其他数组中删除,这意味着nums [2]应该删除10,6并且只有9应该留下来。

我在使用嵌套循环时遇到了麻烦,任何Ruby向导都可以帮忙吗?

4 个答案:

答案 0 :(得分:10)

这应该这样做:

input = [[10, 6, 14], [6], [10, 6, 9], [10, 13, 6], [10, 13, 6, 9, 16], [10, 13]]
seen = []
output = input.map do |numbers|
  new = numbers.uniq - seen
  seen += new
  new
end
# => output is [[10, 6, 14], [], [9], [13], [16], []]

如果要删除输出中的空列表,只需

output.reject!(&:empty?)

答案 1 :(得分:3)

require 'set'

nums = [[10, 6, 14], [6], [10, 6, 9], [10, 13, 6], [10, 13, 6, 9, 16], [10, 13]]
found = Set.new
new_nums = []

for subarray in nums do
    sub_new = []
    for i in subarray do
        if not found.member? i
            sub_new << i
        end
        found << i
    end
    new_nums << sub_new
end

puts(nums.inspect)
puts(new_nums.inspect)

答案 2 :(得分:1)

又一种方式。它保持数组中元素的原始顺序:

require 'set'
nums = [[10, 6, 14], [6], [10, 6, 9], [10, 13, 6], [10, 13, 6, 9, 16], [10, 13]]
nums2 = nums.inject([[], Set.new]) do |(output, seen), ary|  
  [output << ary.reject { |a| seen.include?(a) }, seen.union(ary)]
end[0]
p nums2
# [[10, 6, 14], [], [9], [13], [16], []]

答案 3 :(得分:0)

以下是不正确的?是否应删除[6]

nums = [[10, 6, 14], [6], [10, 6, 9], [10, 13, 6], [10, 13, 6, 9, 16], [10, 13]]

def remove_duplicate_numbers( array )
  seen = []
  array.map{ |sub_array|
    result = sub_array - seen
    seen += sub_array
    result
  }
end

p remove_duplicate_numbers( nums )
#=> [[10, 6, 14], [], [9], [13], [16], []]

如果这不是您想要的,请发布您对阵列的实际输出。