each_with_indexメソッドを用いて配列から探したい要素を探し出し、
その要素が何番目の要素であるか調べるメソッドを作ってみます。
以下の配列から数を探して何番目に含まれているか結果を示すsearchメソッドを作成してみます。
input = [3, 5, 9, 12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]
searchメソッドには
とある数値がこのinput配列内に含まれているかのチェック
含まれている場合 → 何番目の要素か出力する。
含まれていない場合 → 含まれていません。と出力する。
このような記述が必要になることが考えられます。
まず調べたい数値が含まれている場合に何番目の要素か知るために
each_with_indexメソッドを使う必要があります。
each_with_index
eachメソッドは配列の要素を取り出せるだけでその要素が何番目であるかは取り出すことはできません。
ところが、each_with_indexメソッドでは「配列の要素」と「何番目の要素なのか」の2つをブロック変数として取り出すことができます。
記述例
input.each_with_index do |item, i|
~
end
itemはinput配列に含まれる要素でinput配列でいうと、3,5,9,12・・・93の値そのものになります。
iは要素の番号(添字)でinput配列でいうと左から順に0,1,2,3,・・・15までの値をとります。
eachメソッドのため配列の要素の最後まで繰り返されるメソッドとなります。
例えば
example = [3, 5, 9, 12]
example.each_with_index do |item, i|
puts "#{item}は#{i}番目の数字です。"
end
これで出力すると、
3は0番目の数字です。
5は1番目の数字です。
8は2番目の数字です。
12は3番目の数字です。
と出力されます。
each_with_indexメソッドでは配列に対して、最後の要素まで繰り返され、要素(item)と何番目の要素か(i)が一緒に取り出せることがわかりました。
それではeach_with_indexメソッドを用いて、探したい値とその値が何番目に含まれているか調べるメソッドを書いていきます。
手順としては
input.each_with_indexでブロック変数|item, i|を取り出します。
取り出した値が探したい値と一致するか条件式を書きます。
条件に合うとき → 何番目の要素か表示する。
条件に合わない時 → その数は含まれていないことを表示する。
def search(target_num, input)
input.each_with_index do |num, index|
if num == target_num
puts "#{num}は#{index + 1}番目の数字です。"
return
end
puts "その数は含まれていません。"
end
end
end
input = [3, 5, 9, 12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]
search(42, input)
searchというメソッドに引数としてtarget_numとinputを指定します。
target_numは探したい数字で、inputは探す元となる配列です。
input.each_with_index do |num, index|
の部分でinput配列から要素numとその要素が何番目か(index)を配列の最後の値まで取り出しています。
if num == target_num
ここでは配列の要素(数字)と探したい数字(今回は最後に42を調べます)が一致するかの条件式を書いています。
一致した場合、putsメソッドで探したい数と何番目の要素かが表示されます。
完成!
作成中に疑問に思ったこと。
ifで含まれていたら表示する記述を、elseで含まれていなければ含まれていない表示をする記述を書けばいいのでは?
と思い以下の記述を行いました。
def search(target_num, input)
input.each_with_index do |num, index|
if num == target_num
puts "#{num}は#{index + 1}番目の数字です。"
else
puts "その数は含まれていません。"
end
end
end
この場合の結果を表示してみましょう。
input = [3, 5, 9, 12]
と仮に置いてみると
search(9, input)
とした時に
その数は含まれていません。
その数は含まれていません。
9は3番目の数字です。
その数は含まれていません。
このような表示になってしまい、全ての結果が表示されてしまうことになってしまいます。
つまり配列内の要素が多くなればなるほど無駄な結果が増えてしまいます。
そこで含まれている場合の処理のみで完結させてあります。
if num == target_num
puts "#{num}は#{index + 1}番目の数字です。"
return
end
含まれていた場合でもreturnが記述されていることでそこで処理が終了するため"その数は含まれていません"の処理は読み込まれず出力することができます。