自己代入でカウンターをつくる
今回はカウンターと剰余を使って配列を組み直してみる。
目次
カウンターで繰り返しの回数を数える
eachメソッドは配列から要素を取りだす動作を要素がなくなるまで繰り返す。
eachメソッドが繰り返した回数を数えることができるとなにかと便利になる。
自己代入という方法を使ってカウンターをつくってみる。
コードを書く。
test.rb
crews = [ "A-1crew", "A-2crew", "A-3crew", "A-4crew", "A-5crew", "A-6crew", "B-1crew", "B-2crew", "B-3crew", "B-4crew", "B-5crew", "B-6crew" ] count = 0 crews.each do |crew| count += 1 puts "#{count}番目のクルー: #{crew}" end puts "合計#{count}クルー"
1番目のクルー: A-1crew 2番目のクルー: A-2crew 3番目のクルー: A-3crew 4番目のクルー: A-4crew 5番目のクルー: A-5crew 6番目のクルー: A-6crew 7番目のクルー: B-1crew 8番目のクルー: B-2crew 9番目のクルー: B-3crew 10番目のクルー: B-4crew 11番目のクルー: B-5crew 12番目のクルー: B-6crew 合計12クルー
コードの説明。
- 12個の要素が入った配列をつくる
- 数値の0を変数countに代入する(初期化する)
- eachメソッドで繰り返しを開始する
+=
メソッドで変数countに自己代入する- 自身を変更して自身に代入し直すことを自己代入という
count += 1
はcount = count + 1
と同じ意味- 今回の例では繰り返される度countに1が足される
- putsメソッドで変数を出力する
- countの最終回数が出力される
変数countがeachメソッドの繰り返す回数を数えた。
剰余をもとめる演算子 %
割り算の余りを返すメソッドに%
がある。
試してみる。
コメントに実行結果を書いておく。
p 12 % 6 #=> 0 p 13 % 6 #=> 1 p 14 % 6 #=> 2
コードの説明。
最初の式は12を6で割った余りを返す。割り切れるので0が返っている。
2番目の式は13を6で割った余りの1が返っている。
3番目の式は14を6で割った余りの2が返っている。
配列の要素を指定の数ずつ配列に格納し直す
カウンターと剰余を使って配列の要素を3つずつにわけるテストをする。
test.rb
numbers = [1,2,3,4,5,6,7,8,9,10,11,12] unit_numbers = [] new_numbers = [] count = 0 numbers.each do |number| count += 1 if count % 3 == 1 unit_numbers = [] end unit_numbers << number if count % 3 == 0 new_numbers << unit_numbers end end p new_numbers
実行結果
見やすいように改行を入れました。
[ [1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12] ]
コードの説明。
- 12個の要素が入った配列numbersをつくる
- 空の配列unit_numbersをつくる(初期化する)
- 空の配列new_numbersをつくる(初期化する)
- 変数countに0を代入する(初期化する)
- eachメソッドで繰り返しを開始する
- 繰り返すごとcountに1を自己代入する(カウンターを回す)
- if文で条件判断
- countを3で割った剰余が1のとき(1,4,7,10.....)
- 配列unit_numbersを空にする
<<
メソッドでunit_numbersに要素を追加する- if文で条件判断
- countが3で割り切れたら
- unit_numbersをnew_numbersに格納する
- 繰り返しが終わったらpメソッドでnew_numbersを出力する
3で割って剰余が1の度に配列が空になる、ということは3つの要素が取り出された次のタイミングでunit_numbersがリセットされる、ということ。
3で割り切れるとき、つまりunit_numbersにオブジェクトが3つ入ったとき、unit_numbersはnew_numbersに格納されていく。
配列の要素を3つずつに分けることに成功した。
今回の動作確認環境
Ruby 2.4.3p205
macOS 10.13.4
ターミナル 2.8.2
Windows10 1709
Windows PowerShell 5.1.16299.251