Ruby - 配列内で要素数が最多のものを求める!
Updated:
Ruby で、配列内で最も多い要素を求める方法の備忘録です。
ちょっとしたスクリプトだが、意外と便利で当方は使用する頻度も少なくないです。
0. 前提条件
- Ruby 2.1.3-p242 での作業を想定。
- 色々とやり方はあると思うが、今回は2通りだけ紹介。
1. Ruby スクリプト・その1
ary = [5,3,3,4,1,3,3,4,5,2,3,5,4,1,3,3,4,5,2,3]
ary.group_by { |e| e }.sort_by { |e, v| -v.size }.map(&:first).first
上記のスクリプトを実際に実行してみると、 3
が返ってくるはずである。
やっていることは以下のとおりだが、実際に順を追って実行してみると分かり安いだろう。
group_by
メソッドでグループ化sort_by
メソッドで要素数でソートmap
メソッドで要素の値を取得first
で1番目の値を取得
2. Ruby スクリプト・その2
ary = [5,3,3,4,1,3,3,4,5,2,3,5,4,1,3,3,4,5,2,3]
ary.max_by { |v| ary.count(v) }
上記のスクリプトを実際に実行してみると、 3
が返ってくるはずである。
やっていることは、
max_by
メソッドで、ブロックの戻り値が最大となる要素を取得- ブロック内では、各要素ごとに配列内の個数をカウント
3. 所感
- その1のスクリプトは少し煩雑な気もするが、Ruby の様々な要素が含まれていて勉強になる。
- 実装するなら、その2のスクリプトの方が楽かも知れない。
- ベンチマークは採っていないが、大きな配列が扱う場合には考えたほうがよいかも知れない。
- 要素数が同じものが複数存在する場合はどうするか、という問題があるが、それは実際に実装する際に決めることに。
実は、配列の行と列を入れ替える transpose
メソッドの存在を初めて知って感動したとき同様、 group_by
メソッドの存在を知って感動した次第です。
以上
Comments