配列の配列があり、同じ要素を持つすべての配列をフィルター処理したいと考えていますが、それらの順序のみが異なる可能性があります。
[[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
、冗長な項目を取り除きます。
現時点では、すべての回答で一意性関数として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'
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
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]]