【Ruby】each_with_indexを使って配列内の順番を特定する


 「each_with_index」とはRubyで使えるメソッドです。繰り返し処理と同時にその要素が何番目に処理されたのかが分かるようになります。

  では任意の数字が何番目に格納されているかを確認できるプログラムを作っていきます。下記の配列を用います。

input = [2, 6, 7, 14, 15, 21, 29, 38, 42, 51, 60, 78, 81, 84, 95, 102]

 プログラミング初心者らしく、初歩的なミスを含め、単純な発想でコードを書いては修正するプロセスを見せたいと思います。以下の流れで説明していきます。

  1. each_with_indexを使う
  2. 探したい値を入力させる
  3. 条件分岐で出力
  4. 必要な情報だけ表示されるようにする

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番目にあります

 ここから特定の値だけを取り出す処理を考えていきたいと思います。

2. 探したい値を入力させる

 では、入力された値が何番目にあるかを特定できるようにします。このseachメソッド内に処理を記述していきます。

def search(target, input)
  #each_with_indexを用いた処理を記述
end

input = [2, 6, 7, 14, 15, 21, 29, 38, 42, 51, 60, 78, 81, 84, 95, 102]
puts "整数を入力してください"
target = gets.to_i
search(target, input)

3. 条件分岐で出力

 そして入力した「target」が、「num」と同じ値だった時に、「target」の順番を表示させるようにコードを書き直しました。

def search(target, input)
  input.each_with_index do |num, i|
    if target == num 
      puts "#{target}#{i+1}番目にあります"
    else
      puts "その数は配列に含まれていません" 
    end
  end
end

input = [2, 6, 7, 14, 15, 21, 29, 38, 42, 51, 60, 78, 81, 84, 95, 102]
puts "整数を入力してください"
target = gets.to_i
search(target, input)

 15を入力した場合、出力結果は以下のようになりました。

その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
15は5番目にあります
その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません

 ここから、「15は5番目にあります」だけを表示させるようにしていきます。

4. 必要な情報だけ表示されるようにする

 必要な情報だけ表示されるように「rerurn」を加えてみました。

def search(target, input)
  input.each_with_index do |num, i|
    if target == num 
      puts "#{target}#{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]
puts "整数を入力してください"
target = gets.to_i
search(target, input)

 しかしこれでは出力結果は以下のようになります。配列に含まれていない値を入力した場合は「その数は配列に含まれていません」というワードが16回繰り返されます。

その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
その数は配列に含まれていません
15は5番目にあります

 ということで、「その数は配列に含まれていません」というワードをeach_with_indexの外に追いやると、意図した結果を得られるようになりました。

def search(target, input)
  input.each_with_index do |num, i|
    if target == num 
      puts "#{target}#{i+1}番目にあります"
      return
    end
  end
  puts "その数は配列に含まれていません" 
end

input = [2, 6, 7, 14, 15, 21, 29, 38, 42, 51, 60, 78, 81, 84, 95, 102]
puts "整数を入力してください"
target = gets.to_i
search(target, input)

 以上です。