2D массив - Как удалить дубликаты значений, но разделить подмассивы - PullRequest
4 голосов
/ 03 июня 2019

Я хочу удалить дубликаты из моего 2d массива, но мне нужно хранить отдельные массивы отдельно.

Массивы:

a = [1,2,3,4]
b = [2,3,4,5]
c = [3,4,5,6]
d = [4,5,6,7]

newarray = [[1,2,3,4], [2,3,4,5], [3,4,5,6], [4,5,6,7]]

хочу получить следующий результат:

newarraynoduplicates = [[1,2,3,4], [5], [6], [7]]

Я пробовал следующие вещи

[a|b|c|d] => [[1, 2, 3, 4, 5, 6, 7]]
[a|b|c|d] =>  [1, 2, 3, 4, 5, 6, 7]

также пытался

newarray.uniq! => nil!

Ответы [ 4 ]

8 голосов
/ 03 июня 2019

Наиболее общим подходом будет:

[[1,2,3,4], [2,3,4,5], [3,4,5,6], [4,5,6,7]].
  each_with_object([]) { |a, acc| acc << a - acc.flatten } 
#⇒ [[1, 2, 3, 4], [5], [6], [7]]

или

[[1,2,3,4], [2,3,4,5], [3,4,5,6], [4,5,6,7]].
  reduce([]) { |acc, a| acc << a - acc.flatten }
#⇒ [[1, 2, 3, 4], [5], [6], [7]]
3 голосов
/ 03 июня 2019

Я думаю, что вы ищете:

new_array = [a, b - a, c - b - a, d - c - b - a ]
#=> [[1,2,3,4], [5], [6], [7]]
1 голос
/ 03 июня 2019
require 'set'

def doit(arr)
  s = Set.new
  arr.map { |a| a.select { |e| s.add?(e) } }
end

doit [[1,2,3,4], [2,3,4,5], [3,4,5,6], [4,5,6,7]]
  #=> [[1, 2, 3, 4], [5], [6], [7]] 
doit [[1,2,2,3,4], [2,3,4,5,3], [3,4,5,6], [4,5,6,7]]
  #=> [[1, 2, 3, 4], [5], [6], [7]]

См. Set # add? . Это должно быть довольно эффективным, так как поиск по заданным наборам выполняется очень быстро.

0 голосов
/ 04 июня 2019

Я не делал много тестов, но, кажется, работает:

newarray = [[1,2,3,4], [2,3,4,5], [3,4,5,6], [4,5,6,7]]

newarray.map.with_index { |e, i| (e - newarray.reverse[newarray.size - i..].flatten).uniq }
#=> [[1, 2, 3, 4], [5], [6], [7]]

Или, чтобы избежать реверсирования в каждом цикле:

newarray.reverse.then{ |ary| newarray.map.with_index { |e, i| (e - ary[newarray.size - i..].flatten).uniq } }
...