2

我有一个数组数组,并且想要过滤所有具有相同元素的数组,这些元素可能只是它们的顺序不同。

[[1,0,1],[1,1,0],[2,3,5]] => [[1,0,1],[2,3,5]]

或类似的。也许我应该为此使用Set类?但也许这也可以用另一种方法来实现?

4

4 回答 4

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删除冗余项。

于 2013-02-03T02:13:58.037 回答
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
于 2013-02-03T02:04:18.783 回答
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是一种核心优化方法,总体而言它可能会表现得更好。

于 2013-02-03T11:00:51.920 回答
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]]
于 2013-02-03T02:11:27.590 回答