3. 配列
2015/03/24 シナジーマーケティング(株) 松尾 裕美
3.1 配列の生成2
配列は Array クラスのインスタンスです。
配列のリテラルは [1, 2, 3] のように全体を [ と ] で囲み、各要素を , で区切ります。
values = [1, 2, 3] p values alphabets = ["A", "B", "C", "D", "E"] p alphabets
> ruby array_sample.rb [1, 2, 3, 4, 5] ["A", "B", "C", "D", "E"]
配列は Array.new(size=0, val=nil) を用いて生成することもできます。
第一引数は要素数、第二引数は各要素に設定する値です。
values = Array.new(3) p values values[0] = "A" values[1] = "B" values[2] = "C" p values
> ruby array_sample2.rb [nil, nil, nil] ["A", "B", "C"]
文字列配列およびシンボル配列については、特別なリテラル記法が用意されています。
それぞれ %w, %W, %i, %I です。
%w は %w(taro jiro hanako) のように記述します。
%w( と ) の間にはホワイトスペースで区切られた文字列を記述します。
これは [“taro”, “jiro”, “hanako”] と同じ配列を生成します。
p %w(taro jiro hanako) p ["taro", "jiro", "hanako"]
> ruby array_sample3.rb ["taro", "jiro", "hanako"] ["taro", "jiro", "hanako"]
ホワイトスペースを区切り文字ではなく値として認識させたい、という場合は「\」でエスケープします。
p %w(古池や\ 蛙飛び込む\ 水の音 五月雨を\ あつめて早し\ 最上川)
> ruby array_sample4.rb ["古池や 蛙飛び込む 水の音", "五月雨を あつめて早し 最上川"]
%w では要素の区切りはあくまでホワイトスペースなので、半角スペース以外で区切ることもできます。
値が長くなりすぎる場合は、以下のように改行で区切ったほうが読みやすくなるでしょう。
urls = %w( http://www.techscore.com/tech/Java/index/ http://www.techscore.com/tech/Ruby/ http://www.techscore.com/tech/sql/index.html http://www.techscore.com/tech/XML/index.html http://www.techscore.com/tech/DesignPattern/index.html http://www.techscore.com/tech/UML/index.html http://www.techscore.com/tech/C/index.html )
%W も文字列配列を生成しますが、以下のように変数展開を利用できるところが %w とは異なります。
momotaro = "桃太郎" kintaro = "金太郎" p %W(桃から生まれた#{momotaro} まさかり担いだ#{kintaro})
> ruby array_sample5.rb ["桃から生まれた桃太郎", "まさかり担いだ金太郎"]
%i および %I は Ruby2.0 から登場した、シンボルの配列を生成する記法です。
使い方は %w と %W と全く同じで、生成される結果が文字列配列であるかシンボル配列であるかだけ異なります。
p %i(left right top bottom) prefix = "direction" p %I(#{prefix}_left #{prefix}_right #{prefix}_top #{prefix}_bottom)
> ruby array_sample6.rb [:left, :right, :top, :bottom] [:direction_left, :direction_right, :direction_top, :direction_bottom]
3.2 要素のアクセス3
配列の要素のインデックスは 0 から始まります。
要素へのアクセスは「配列名[インデックス]」で可能です。また、at メソッドを利用することもできます。
values = ["a", "b", "c", "d", "e"] p values[0] p values.at(0)
> ruby array_sample7.rb "a" "a"
指定したインデックスが配列のサイズを超えている場合は nil が返ります。
また、負のインデックスを指定することで、配列の末尾からのインデックスを指定することができます。
values = ["a", "b", "c"] values[-4] # => nil values[-3] # => "a" values[-2] # => "b" values[-1] # => "c" values[0] # => "a" values[1] # => "b" values[2] # => "c" values[3] # => nil
インデックスには範囲演算子1や開始インデックスと要素数を指定することで、配列をスライス(部分配列を取得)することもできます。
values = ["a", "b", "c", "d", "e"] # インデックス0~3にアクセス p values[0..3] # => ["a", "b", "c", "d"] # インデックス0から3つ分の要素にアクセス p values[0, 3] # => ["a", "b", "c"]
> ruby array_sample8.rb ["a", "b", "c", "d"] ["a", "b", "c"]
3.3 要素の挿入と置換
Rubyの配列は可変長です。要素の置換はもちろん、挿入をすることもできます。
置換の場合は、要素へのアクセスと同様に置換対象の要素を指定し、置き換える値を代入します。
置換対象の要素を範囲で指定も可能です。置き換える値が配列の場合は先頭から順に配列の値で置き換えます。
配列を保持する変数 values があるとして、挿入の場合は以下のようにします。
- values[n, 0] = value : values の n 番目に値 x を挿入します。
- values.insert(n, x) : values の n 番目の要素の直前に値 x を挿入します。
- values.insert(n, x1, x2, …, xn) : values の n 番目の要素の直前に x1, x2, …, xn を挿入します。
- values.unshift(x) : values の先頭に値 x を挿入します。
- values << x または values.push(x) : values の末尾に値 x を挿入します。
values = ["a", "b", "c"] # 0 番目を "A" に置換 values[0] = "A" p values # => ["A", "b", "c"] # 1 番目から 2 つを「["B","C"]」に置換 values[1, 2] = ["B","C"] p values # => ["A", "B", "C"] # 3番目に「E」を挿入 values[3, 0] = "E" p values # => ["A", "B", "C", "E"] # 3番目に "D" を挿入 values.insert(3, "D") p values # => ["A", "B", "C", "D", "E"] # 先頭に "---" を挿入 values.unshift("---") p values # => ["---", "A", "B", "C", "D", "E"] # 末尾に "Y" を挿入 values.push("Y") p values # => ["---", "A", "B", "C", "D", "E", "Y"] # 末尾に "Z" を挿入 values << "Z" p values # => ["---", "A", "B", "C", "D", "E", "Y", "Z"] # 要素数を取得 p values.size # => 8
>ruby array_sample9.rb ["A", "b", "c"] ["A", "B", "C"] ["A", "B", "C", "E"] ["A", "B", "C", "D", "E"] ["---", "A", "B", "C", "D", "E"] ["---", "A", "B", "C", "D", "E", "Y"] ["---", "A", "B", "C", "D", "E", "Y", "Z"] 8
3.4 要素を取り除く
配列を保持する変数 values があるとして、要素を取り除くには以下のメソッドを利用します。
- values.delete(x) : values から値 x を全て取り除きます。
- values.delete_at(n) : values から n 番目の要素を取り除きます。
- values.shift : values の先頭の要素を取り除きます。
- values.pop : values の末尾の要素を取り除きます。
要素を取り除くと、配列の要素数も減ります。
values = ["a", "b", "c", "d", "e"] # "a" を取り除く values.delete("a") p values # => ["b", "c", "d", "e"] # 1 番目の要素を取り除く values.delete_at(1) p values # => ["b", "d", "e"] # 先頭の要素を取り除く values.shift p values # => ["d", "e"] # 末尾の要素を取り除く values.pop p values # => ["d"] # 要素数の取得 p values.size # => 1
>ruby array_sample4.rb ["b", "c", "d", "e"] ["b", "d", "e"] ["d", "e"] ["d"] 1
1 範囲演算子とは最小値~最大値を指定する演算子です。「..」と「...」があり、「1..20」は1から20まで、「1...20」は1~19まで(つまり最大値を含まない)を表します。
2 2013/06/09 Ruby2.0 から登場した %i, %I について追記するとともに、%w, %W についても説明を拡充しました。
3 2013/06/09 インデックスに負の値を指定した場合について追記しました。