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 が返ってくるはずである。

やっていることは以下のとおりだが、実際に順を追って実行してみると分かり安いだろう。

  1. group_by メソッドでグループ化
  2. sort_by メソッドで要素数でソート
  3. map メソッドで要素の値を取得
  4. 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 が返ってくるはずである。

やっていることは、

  1. max_by メソッドで、ブロックの戻り値が最大となる要素を取得
  2. ブロック内では、各要素ごとに配列内の個数をカウント

3. 所感

  • その1のスクリプトは少し煩雑な気もするが、Ruby の様々な要素が含まれていて勉強になる。
  • 実装するなら、その2のスクリプトの方が楽かも知れない。
  • ベンチマークは採っていないが、大きな配列が扱う場合には考えたほうがよいかも知れない。
  • 要素数が同じものが複数存在する場合はどうするか、という問題があるが、それは実際に実装する際に決めることに。

実は、配列の行と列を入れ替える transpose メソッドの存在を初めて知って感動したとき同様、 group_by メソッドの存在を知って感動した次第です。

以上





 

Sponsored Link

 

Comments