x = [:a, :b, :b, :b, :c, :c, :c]
counted = Hash[
x.group_by do |e|
x.count(e)
end.map do |count, items|
[count, items.uniq]
end
]
p counted[3] #=> [:b, :c]
これはどのように作動しますか?手順に従ってみましょう。まず、アイテムを数でグループ化しましょう。
grouped_by_count = x.group_by do |e|
x.count(e)
end
これにより、キーがカウントであり、値がそのカウントを持つ一意でないアイテムのリストであるハッシュが生成されます。
p grouped_by_count
#=> {1=>[:a], 3=>[:b, :b, :b, :c, :c, :c]}
ただし、実際にはユニークなアイテムの方が望ましいので、その変換を行いましょう。
grouped_by_count_unique = grouped_by_count.map do |count, items|
[count, items.uniq]
end
p grouped_by_count_unique
#=> [[1, [:a]], [3, [:b, :c]]]
これにより、ハッシュではなく、配列の配列が得られます。幸いなことに、配列の配列をハッシュに変換するのは簡単です。
counted = Hash[grouped_by_count_unique]
p counted
# => {1=>[:a], 3=>[:b, :c]}
次に、一時的なものを排除してピースを組み立てるだけで、一番上に答えが得られます.