はじめに
前回、配列内の数字の合計(同じ数字を除く)の記事を書いたところ、コメントをいただきました。
ありがとうございます!
今回はそのコメントを元に気づいた点をまとめていきたいと思います。
環境
ruby 2.6.5
学んだこと
私の記述した模範解答だと、線形探索で配列内の数字が多くなればなるほど負荷が大きくなるそうです。
そこで、Hashを用いる方法を教えていただきました。
使用するメソッド
tallyメソッド
instance method Enumerable#tally
["a", "b", "c", "b"].tally #=> {"a"=>1, "b"=>2, "c"=>1}
自身に含まれる要素を数え上げた結果をHashで返してくれるメソッドです。
注意すべきはrubyの version2.7から追加されたメソッド であるという点です。
私の環境では使えませんでした。
NoMethodError
が出てきてあたふたしました。
sumメソッド
instance method Enumerable#sum
要素の合計を返すメソッドです。
{ 1 => 10, 2 => 20 }.sum {|k, v| k * v } # => 50
ブロックが与えられた場合は、加算する前に各要素にブロックが適用されます。
つまり、この例では、
( 1 * 10 ) + ( 2 * 20 )
が計算され、50
が返り値となっています。
条件演算子
コメントいただいたコードをここで表記します。
def lone_sum(ary)
counts = ary.tally
counts.sum { |n, count| count == 1 ? n : 0 }
end
与えられたブロックは count == 1
なら n (key)を足し、それ以外は0を足すというコードになっているようですが、ここがよくわからなかったので調べました。
条件演算子というものだそうです。
リファレンスマニュアル
式1 ? 式2 : 式3
式1がtrueなら式2の値を返し、falseなら式3の値を返すというもののようです。
なるほど。
count == 1
の時にはkeyの数字が計算される数字となるようになり、それ以外は値0が計算される数字になっているということですね!!
終わりに
rubyのバージョンも今の安定版は3.1.2となっていました。
Ruby
常に進化を続けているので、キャッチアップを怠らないようにしないといけないということですね。