表題の通りです。
each_with_indexメソッドを使ってコードを書いてみます。
each_with_indexメソッドとは
要素の繰り返し処理と同時に、その要素が何番目に処理されたのか表すことができるメソッド。
要素の繰り返し処理であればeachメソッドもできるが、
each_with_indexメソッドは、何番目に処理されたものかも表示できるのが特徴。
下記のように書く。
配列名.each_with_index do |item, i|
# 処理
end
使ってみた(その1)
fruits = ["みかん", "パイナップル", "りんご"]
fruits.each_with_index do |fruit, i|
puts "#{i}番目のフルーツは、#{fruit}です。"
end
出力結果は下記のようになる。
0番目のフルーツは、みかんです。
1番目のフルーツは、パイナップルです。
2番目のフルーツは、りんごです。
使ってみた(その2)
配列に、ある値が含まれているかを検索して、結果を出力するメソッドを
each_with_indexメソッドを使って書いてみます。
わざわざeach_with_indexメソッド使わなくてもバイナリーサーチ使えば良いのでは
配列は
input = [3, 6, 9 ,12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]
検索したい値は変数target_num
に代入するとします。
下記のような検索結果が出るようにします。
# 検索したい値が配列の中にあったとき。たとえば検索したい値が12だった場合
左から4番目にあります
# 検索したい値が配列の中にないとき
その数は含まれていません
回答例
def search(target_num, input)
input.each_with_index do |num, index|
if num == target_num
puts "左から#{index + 1}番目にあります"
return
end
end
puts "その数は含まれていません"
end
input = [3, 6, 9 ,12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]
target_num = gets.to_i
search(target_num, input)
解説
今回は検索する処理を行うメソッドをsearchメソッドと定義しました。
そのsearchメソッドの中で、each_with_indexメソッドを使い、
配列input
に格納されている値をnum
として1つずつ取り出し、取り出された順で番号付けをします。その番号はindex
に入ります。
num
と、target_num
(検索したい値が入っている)が同じか比べます。
もし同じであれば、その値が配列の左から数えて何番目にあるのかを出力したいので、
puts "左から#{index + 1}番目にあります"
とします。
そして、もう検索結果が出てしまって、これ以上の検索が必要なくなるのでreturn
で終わりにします。
配列に格納されているすべての値と、検索したい値が同じにならなかった場合は、
puts "その数は含まれていません"
とします。
おわり
以上です。
本題から少しずれますが解説部分を書くのがなかなか難しい・・。
最後まで読んでくださった方ありがとうございました。