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

現時点では、すべての回答で一意性関数として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 に答える
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 に答える
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 に答える