|
配列 (Array)
Array(配列)オブジェクトとは、他のオブジェクトの所在を記憶し、それらへのアクセス手段を与える
「コンテナ型」のオブジェクトである。
基本
配列の宣言
- 方法1
- Array オブジェクトの生成は、角括弧[] を使用して行う
- 各括弧[] の中にオブジェクトを列挙することにより、それらを要素とする配列を生成できる
0
1
| | num_array = [2, 4, 6]
str_array = ["apple", Time.new, num_array]
|
- 方法2
- Array のクラスメソッドを使用して宣言することもできる
- Array.new(n, obj) で宣言できる
- obj を省略すると、nil で補填
0
1
| | Array.new(3, 10) Array.new(3)
|
- 方法3
- 文字列の配列をリテラルに生成するには %w を使う
- 空白文字で切り分けて配列にする
- 空白文字はバックスラッシュでエスケープできる
要素へのアクセス
- 配列参照メソッド[] (角括弧) で参照する
- 配列の要素番号(インデックス)は、0 から始まる
- インデックスが配列の大きさ以上であるときは、nil が返ってくる
- インデックスの値が負の場合、配列の後ろから数えた位置の要素を返す
0
1
2
3
4
5
6
7
| | num_array[2] str_array[0] str_array[2][2]
num_array[3] num_array[-1] num_array[-3] num_array[-4]
|
要素の差し替え
- 配列代入メソッド[] (角括弧) を使用する
- 要素を指定して代入する
0
1
| | num_array = [2, 4, 6]
num_array[1] = 8
|
要素の追加と取り出し
要素の追加 (push, unshift)
- 既に生成されている配列に対して、要素を追加するメソッドに push と unshift がある
- push は配列の末尾に追加する
- unshift は配列の先頭に要素を追加する
0
1
2
| | num_array = [1, 2, 3]
num_array.push(4) num_array.unshift(0)
|
要素の取り出し (pop, shift)
- pop は、配列の末尾から要素を取り出す。式の評価結果は、取り出した要素の値
- shift は、配列の先頭から要素を取り出す。式の評価結果は pop と同様
- 配列が空の場合、評価結果は nil となる
0
1
2
3
4
5
6
7
| | num_array = [1, 2, 3]
num_array.pop num_array = [1, 2, 3]
num_array.shift
num_array = []
num_array.pop num_array.shift
|
配列の利用
ループ
要素ごとのループ (each)
- each メソッドは、全ての要素に対して処理をする
0
1
2
| | [0, 1, 2].each do |x|
puts x * x end
|
インデックスごとのループ (each_index, each_with_index)
- each_index は、ブロックパラメータにインデックスを代入する
- each_with_index はインデックスと共に要素もブロックパラメータに加える
0
1
2
3
4
5
6
7
| | array = ["apple", "base", "cat"]
array.each_index do |i|
p [a[i], i] end
array.each_with_index do |x, i|
p [x, i] end
|
逆順のループ (reverse_each)
- reverse_each は、配列の末尾から先頭に向かって逆順にループする
0
1
2
| | [0, 1, 2].reverse_each do |x|
puts x * x end
|
演算子
- 連結 +
- array1 + array2 は、2 つの配列を連結して新しいオブジェクトを返す
- 元の配列自体を操作したい場合は、connect メソッドを使用する
- 差 -
- array1 - array2 は、array1 の要素の内、array2 の要素と等しいものを省いた配列を返す
0
| | [0, 1, 2, 3, 4] + [3, 1]
|
- 積 *
- array * n は、array を n 個繋げたオブジェクトを返す
- AND &
- array1 & array2 は、共通する要素でできた配列を返す
- 重複する要素は省かれる
0
| | [1, 1, 2, 2, 1] & [2, 1, 1, 3]
|
- OR |
- array1 | array2 は、何れかに属する要素でできた配列を返す
- 重複する要素は省かれる
0
| | [1, 1, 2, 2, 1] | [2, 1, 1, 3]
|
検索と検査
要素の検索 (index, rindex)
- 配列 array のインデックス i に対する要素は array[i] で取り出せるが、
要素 x が array に含まれているかどうかを知る為に index を使用する
- もし見つかれば、その添え字を返し、なければ nil を返す
- 末尾から検索する場合は、rindex を使用する
0
1
2
3
| | ["apple", 0, "banana", 2, "apple"].index("banana") ["apple", 0, "banana", 2, "apple"].index("kiwi")
["apple", 0, "banana", 2, "apple"].rindex("apple")
|
要素の検査 (include?)
- 配列の要素となっているか否かを調べるだけの場合に使用する
- 返す値は true か false である
0
1
| | ["a", "b", "c", "d", "e"].include?("a") ["a", "b", "c", "d", "e"].include?("f")
|
要素の抽出 (indexes)
- 与えられたインデックスに対応する要素を配列として抽出する
- indices も同様である
0
| | ["a", "b", "c", "d", "e"].indexes(1, 4, 3)
|
その他のメソッド (nitems, size, length, empty?)
- nitems は、nil でない要素の数を返す
- size, length は、配列の大きさを返す
- empty? は、配列の size が 0 か否かを真偽の値で返す
0
1
2
3
4
5
6
7
| | [0, nil, 2, 3, nil].nitems [0, 1, 2].size [0, 1, 2].length
array = [0, 1, 2]
until array.empty?
p array.shift end
|
|
|