「each_with_index」とはRubyで使えるメソッドです。繰り返し処理と同時にその要素が何番目に処理されたのかが分かるようになります。
では任意の数字が何番目に格納されているかを確認できるプログラムを作っていきます。インデントは整っていないのでそこはご了承ください。下記の配列を用います。
input = [2, 6, 7, 14, 15, 21, 29, 38, 42, 51, 60, 78, 81, 84, 95, 102]
以下の流れで説明していきます。
- each_with_indexを使う
- 任意の値を指定できるようにする
- 引数を使って条件分岐
- 特定の情報だけ表示されるようにする
1. each_with_indexを使う
ではまずeach_with_indexを使ってみたいと思います。
input = [2, 6, 7, 14, 15, 21, 29, 38, 42, 51, 60, 78, 81, 84, 95, 102]
input.each_with_index do |num, i|
puts "#{num}は#{i}番目にあります"
end
上記のコードを実行すると結果は下記のようになります。
2は0番目にあります
6は1番目にあります
7は2番目にあります
14は3番目にあります
15は4番目にあります
21は5番目にあります
29は6番目にあります
38は7番目にあります
42は8番目にあります
51は9番目にあります
60は10番目にあります
78は11番目にあります
81は12番目にあります
84は13番目にあります
95は14番目にあります
102は15番目にあります
ここから特定の値だけを取り出す処理を考えていきたいと思います。またブロック変数は0から始まるため、iに+1を加える必要がありそうです。
2. 任意の値を指定できるようにする
任意の値を決めてその値が何番目にあるかを確認できるようにクラスを用意しました。これを今度は「15は5番目にあります」だけ表示されるようにしていきます。
def search(num_target, input)
input.each_with_index do |num, i|
puts "#{num}は#{i+1}番目にあります"
end
end
input = [2, 6, 7, 14, 15, 21, 29, 38, 42, 51, 60, 78, 81, 84, 95, 102]
search(15, input)
3. 引数を使って条件分岐
実引数「15」を受け取った仮引数「num_target」が、「num」と同じ値だった時に何番目にあるかが表示されるように下記のようにコードを書き直しました。また配列に含まれていない値だった場合の処理も書いてみました。
def search(num_target, input)
input.each_with_index do |num, i|
if num_target == num
puts "#{num}は#{i+1}番目にあります"
else
puts "その数は配列に含まれていません"
end
end
end
input = [2, 6, 7, 14, 15, 21, 29, 38, 42, 51, 60, 78, 81, 84, 95, 102]
search(15, input)
すると実行結果は以下のようになりました。
その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
15は5番目にあります
その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
4. 特定の情報だけ表示されるようにする
「15は5番目にあります」だけを表示させたいためreturnを使ってみました。
def search(num_target, input)
input.each_with_index do |num, i|
if num_target == num
puts "#{num}は#{i+1}番目にあります"
return
else
puts "その数は配列に含まれていません"
end
end
end
input = [2, 6, 7, 14, 15, 21, 29, 38, 42, 51, 60, 78, 81, 84, 95, 102]
search(15, input)
そうすると実行結果は以下のようになりました。
その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
15は5番目にあります
現状のコードだと4番目までの値も確認されているようです。そこで、「その数は配列に含まれていません」というワードをeach_with_indexの外に追いやりました。
def search(num_target, input)
input.each_with_index do |num, i|
if num_target == num
puts "#{num}は#{i+1}番目にあります"
return
end
end
puts "その数は配列に含まれていません"
end
input = [2, 6, 7, 14, 15, 21, 29, 38, 42, 51, 60, 78, 81, 84, 95, 102]
search(13, input)
これでやっと意図した実行結果を得られるようになりました。
以上です