我有一个数组数组,想要过滤所有具有相同元素的数组,这些数组的顺序可能不同。
[[1,0,1],[1,1,0],[2,3,5]] => [[1,0,1],[2,3,5]]
或类似的。也许我应该使用Set课程呢?但也许这也可以用另一种方法来实现?
答案 0 :(得分:10)
[[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
将删除多余的项目。
答案 1 :(得分:2)
这应该这样做。
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
答案 2 :(得分:2)
此时所有答案都使用 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
是一种核心优化方法,总体来说它可能会表现得更好。
答案 3 :(得分:0)
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]]