从嵌套数组中删除重复项

3
我有一个包含数字数组的数组,按特定顺序排列。我想从嵌套的数组中删除重复项,但有一个层次结构:如果数字在较低索引的数组中出现,则删除下面所有的重复项。
例如: nums = [[10, 6, 14], [6], [10, 6, 9], [10, 13, 6], [10, 13, 6, 9, 16], [10, 13]]
nums[0] 包含 [10,6,14],因此应该从链中的其他数组中删除任何后续出现的 10,6,14,意味着在 nums[2] 中应该删除 10,6 并只保留 9。
我用嵌套循环做这个有困难,有什么 Ruby 神仙可以帮忙吗?
4个回答

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?)

哇,这真是美丽而优雅。谢谢! - beeudoublez
现在接受作为答案,网站让我等了2分钟。 - beeudoublez

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)

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], []]

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], []]

如果这不是你想要的,请发布你期望的数组实际输出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接