Ruby 2D数组-如何删除重复值但保持子数组分离

Ruby 2D数组-如何删除重复值但保持子数组分离,ruby,multidimensional-array,filter,duplicates,Ruby,Multidimensional Array,Filter,Duplicates,我想从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,

我想从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!

我认为您正在寻找:

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

最通用的方法是:

[[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]]。
每个带有_对象([]){| a,acc | acc的|u


请参阅。这应该非常有效,因为设置查找速度非常快。

我没有做过很多测试,但它似乎可以工作:

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 } }

如果我们有
1000
arrays怎么办?:)mudsie,您已经隐式假设
arr.first
不包含重复项。虽然OP的示例不包含重复项,但规范对此保持沉默。@CarySwoveland为true。
reduce(arr.pop.uniq){…}
会解决这个问题。
unshift
,当然。正确版本:
arr.dup.tap{a | break a.reduce(a.unshift.uniq){acc,e | acc
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]]
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 } }