将数组数组转换为数组

时间:2013-02-03 01:56:46

标签: ruby arrays set

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

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

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

4 个答案:

答案 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]]