LoginSignup
1
0

More than 1 year has passed since last update.

配列内の数字の合計(同じ数字を除く)再考察

Last updated at Posted at 2022-07-19

はじめに

前回、配列内の数字の合計(同じ数字を除く)の記事を書いたところ、コメントをいただきました。

配列内の数字の合計(同じ数字を除く)

ありがとうございます!
今回はそのコメントを元に気づいた点をまとめていきたいと思います。

環境

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

常に進化を続けているので、キャッチアップを怠らないようにしないといけないということですね。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0