roy > naoya > 基礎プログラミングII[月1] > (4)配列の復習とARGV > 補足

(4) 11/03の授業内容:配列の復習とARGV 補足

配列の生成と配列処理メソッド

配列処理メソッドとしてこれまで利用してきたのはlengthのみであったが、他にも多数のメソッドがある。ここでまとめてみよう。

配列生成(リテラル配列)
プログラム中に書く「具体的な値」のことをリテラルと呼ぶ。リテラル配列では具体的な値をカンマで区切って表記する。例えば
x=[100,60,20,"xyz"]
では、xが要素として1、2、3、xyzを含む配列であることを意味している。
配列生成(Array.new)
決まった長さの初期配列や、決められた値で埋め尽くさされた初期配列を作ることもできる。この場合はArray.newを使用する。以下のような書き方がある。
a=Array.new(長さ)
a=Array.new(長さ,初期値)
例えば、a=Array.new(5)の場合は、[nil,nil,nil,nil,nil]のように各要素の初期値がnilの配列が生成される。nilはデータがないという意味。a=Array.new(5,10)の場合は[10,10,10,10,10]という配列が生成される。
配列の連結(+メソッド)
+メソッドは基の配列と別の配列をつなげた新しい配列を返す。
a = [50,20,80,10]、b = [30,90,60]の場合、
c = a + b
p c #=> [50,20,80,10,30,90,60]

配列cを作成した後でも配列aおよびbの値は変化しない。
配列末尾への破壊的要素追加(<<メソッド)
<<メソッドは、配列の末尾に新しい要素を追加する。元の配列自体が変更する。元の値を直接書き換える操作を破壊的操作と言う。
a = [50,20,80,10]の場合、
a << 70
p a #=> [50,20,80,10,70]
配列の破壊的結合(concatメソッド)
引数に指定した配列をもとの配列の末尾に破壊的に結合する。
a = [50,20,80,10]、b = [30,90,60]の場合、
a.concat(b)
p a #=> [50,20,80,10,30,90,60]

となり、配列aの値が変化する。bは変化しない。
要素を順番に取り出す(eachメソッド)
配列の中の値である要素を順番に取り出す方法としてeachメソッドがある。
 a.each do |i|
  〜配列aの要素をiに順番に代入しながら処理を繰り返し実施する
 end

eachメソッドのかわりにwhile文やfor文を使って書くこともできる。
指定要素の発見(index(val)メソッド)
indexメソッドは指定した配列に引数valと等しい値があるか調べ、最初に見つかった位置のインデックスを返す。見つからない場合はnilを返す。
a = [50,20,80,10]の場合、
p a.index(20) #=>1
p a.index(70) #=>nil
配列の長さを返す(lengthもしくはsizeメソッド)
lengthメソッドおよびsizeメソッドは配列の長さ(要素の数)を返す
a = [50,20,80,10]の場合、
p a.length #=>4
p a.size #=>4
配列を結合して文字列化(join(sep)メソッド)
配列の各要素の間に文字列sepを挟んで連結した文字列を返す。sepを省略した場合はそのまま各要素が連結される
a = [50,20,80,10]の場合、
p a.join("/") #=>"50/20/80/10"
p a.join #=>"50208010"
末尾への破壊的追加(push(val1,val2,...)メソッド)
pushメソッドは配列の末尾に引数で指定した要素valを破壊的に追加する。追加する要素は複数指定できる。
a = [50,20,80,10]の場合、
a.push(70, 60)
p a #=>[50,20,80,10,70,60]

破壊的操作なのでaの値が変化する。
末尾要素の破壊的取り出し(popメソッド)
配列の末尾の要素を破壊的に取り除き、取り除いた要素の値を返す。要素がない場合にはnilを返す。
a = [50,20,80,10]の場合、
p a.pop #=> 10
これにより配列aは10が取り除かれa=[50,20,80]となる。
配列の逆順への並び替え(reverseメソッド)
配列の要素をすべて逆順に並べ替えた配列を返す
a = [50,20,80,10]の場合、
p a.reverse #=>[10,80,20,50]
p a #=>[50,20,80,10]

破壊的操作ではないのでaの値は変わらない。
配列の破壊的な逆順への並び替え(reverse!メソッド)
配列の要素をすべて破壊的に逆順に並べ替えた配列を返す。
a = [50,20,80,10]の場合、
p a.reverse! #=>[10,80,20,50]
p a #=>[10,80,20,50]

破壊的操作であるためaの値も変化する。
先頭要素の破壊的な取り出し(shiftメソッド)
配列の先頭要素を破壊的に取り出しその値を返す。配列内の要素はひとつずつ前につめられる
a = [50,20,80,10]の場合、
p a.shift #=>50
p a #=>[20,80,10]

破壊的操作なのでaの値も変化する。
先頭への要素の破壊的追加(unshift(val)メソッド)
配列の先頭に要素valを破壊的に追加し、その配列を返す。配列内の要素はひとつずつ後ろにずれる。
a = [50,20,80,10]の場合、
p a.unshift(70) #=>[70,50,20,80,10]
p a #=>[70,50,20,80,10]

破壊的操作なのでaの値も変化する。
重複要素の削除(uniqとuniq!メソッド)
配列から重複した要素を取り除き、取り除いた部分を前につめた配列を返す。uniqは破壊的メソッドではないが、uniq!は破壊的メソッドとなる。
c = [10,80,20,50,30,20,50,10,80]の場合
p c.uniq #=>[10,80,20,50,30]
p c #=>[10,80,20,50,30,20,50,10,80]

c = [10,80,20,50,30,20,50,10,80]の場合
p c.uniq! #=>[10,80,20,50,30]
p c #=>[10,80,20,50,30]

uniq!は破壊的操作なのでcの値も変化する。
小さい順に並び替える(sortとsort!メソッド)
配列内の要素を小さい順(昇順)に並び替える。sortは破壊的メソッドではないが、sort!は破壊的メソッドとなる。
a = [50,20,80,10]の場合、
p a.sort #=>[10,20,50,80]
p a #=>[10,80,20,50]

sortは破壊的操作ではないのでaの値は変化しない。配列内の要素が文字の場合文字コードの小さい順に並び替えが行われる。