我有一个数组数组,并且想要过滤所有具有相同元素的数组,这些元素可能只是它们的顺序不同。
[[1,0,1],[1,1,0],[2,3,5]] => [[1,0,1],[2,3,5]]
或类似的。也许我应该为此使用Set类?但也许这也可以用另一种方法来实现?
[[1,0,1],[1,1,0],[2,3,5]].uniq{|i| i.sort}
或者
[[1,0,1],[1,1,0],[2,3,5]].uniq(&:sort)
输出:
[[1, 0, 1], [2, 3, 5]]
sort
将确保所有子数组的顺序相同,并uniq
删除冗余项。
这应该这样做。
require 'set'
set = Set.new
set << [1,0,1].sort
set << [1,1,0].sort
set << [2,3,5].sort
set.each do |e|
puts e.to_s
end
此时所有的答案都使用O(n log n) sort
作为唯一性函数。直方图(频率计数器)为O(n):
require 'facets/enumerable/frequency'
xss = [[1, 0, 1], [1, 1, 0], [2, 3, 5]]
xss.uniq(&:frequency)
#=> [[1, 0, 1], [2, 3, 5]]
但是请注意,这sort
是一种核心优化方法,总体而言它可能会表现得更好。
require 'set'
a = [[1,0,1],[1,1,0],[2,3,5]]
set = Set.new
a.map {|x| set << x.sort}
b = set.to_a
=> [[0, 1, 1], [2, 3, 5]]