Удалить дубликаты из вложенного массива - PullRequest
3 голосов
/ 31 декабря 2010

У меня есть массив массивов, который содержит числа в определенном порядке.Я хочу удалить дубликаты из вложенных массивов, но есть иерархия: если число встречается в нижнем индексе массива, удалите все дубликаты в цепочке массивов.

Пример: 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 голосов
/ 31 декабря 2010

Это должно сделать это:

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?)
3 голосов
/ 31 декабря 2010
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 голос
/ 31 декабря 2010

Еще один способ.Сохраняет оригинальный порядок элементов в массивах:

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 голосов
/ 31 декабря 2010

Является ли следующее неверным?Должен ли [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], []]

Если это не то, что вы хотите, пожалуйста, опубликуйте фактический результат, который вы ожидаете для вашего массива.

...