Ruby資料一覧

配列

2008/8/16更新

対応バージョン: 1.8

要素数取得

lengthメソッド、あるいはsizeメソッドを使用する。

どちらも動作に違いはないが、要素数を「長さ」で扱うか「大きさ」で扱うかによって目的別に使い分けるとソースコードが読みやすくなる。

例)

data = [5,1,2,4,3]

p data.length

=> 5

p data.size

=> 5

要素追加

要素を追加する場所により使用するメソッドが異なる。

pushメソッド (<<演算子も使用可能)

配列の最後に追加(一要素)

concatメソッド

配列の最後に追加(複数要素)

unshiftメソッド

配列の先頭に追加(一要素)

[]演算子

配列の先頭に追加(複数要素)

例)

data = [5,1,2,4,3]

data.push(8)   # data << 8 と同等

p data

=> [5, 1, 2, 4, 3, 8]

data.concat([9, 10])

p data

=> [5, 1, 2, 4, 3, 8, 9, 10]

data.unshift(0)

p data

=> [0, 5, 1, 2, 4, 3, 8, 9, 10]

data[0, 0] = [6, 7]

p data

=> [6, 7, 0, 5, 1, 2, 4, 3, 8, 9, 10]

要素削除

追加と同様、要素を削除する場所により使用するメソッドが異なる。

popメソッド

配列の最後から削除(一要素)

shiftメソッド

配列の先頭から削除(一要素)

delete_atメソッド

配列の任意の場所から削除(一要素)

delete_ifメソッド

配列から指定条件を満たす要素を削除(複数要素)

slice!メソッド

配列の任意の場所から削除(複数要素)

(*) sliceメソッドでは要素は取り出せるが元配列からは取り除かれない

例)

data = [5,1,2,4,3]

data.pop

p data

=> [5, 1, 2, 4]

data.shift

p data

=> [1, 2, 4]

data.delete_at(1)           # 位置1の要素を削除

p data

=> [1, 4]

data = [5,1,2,4,3]

data.delete_if {|x| x < 3}  # 値が3未満の要素を削除

p data

=> [5, 4, 3]

data = [5,1,2,4,3]

data.slice!(1, 2)           # 位置1から2要素分を削除

p data

=> [5, 4, 3]

重複要素除去

uniqメソッドを使用する。

ただし、UNIXのuniqコマンドと違って隣り合っていない重複要素も取り除くので注意が必要である。

例)

data = [5,2,1,2,4,3,2]	# 2が3回重複

p data.uniq

=> [5, 2, 1, 4, 3]

配列の一部取得

[]メソッド、sliceメソッドを使用する。

例)

data = [1,2,3,4,5]

p data[1,2]     # 要素番号1から2要素取り出す(= data.slice(1,2))

=> [2, 3]

p data[2..3]    # 要素番号2〜3を取り出す(= data.slice(2..3))

=> [3, 4]

p data[2..-1]   # 要素番号2から最終要素までを取り出す(= data.slice(2..-1))

=>[3, 4, 5]

条件を満たす要素取得

条件を満たす最初の要素だけを取り出す場合はfindメソッドかdetectメソッドを、全ての要素を取り出す場合はselectメソッドかfind_allメソッドを使用する。

例) 3の倍数を取り出す

data = [1,2,3,4,5,6,7,8,9,10]

out = data.find {|item| item % 3 == 0}
p out

=> 3

out = data.select {|item| item % 3 == 0}
p out

=> [3, 6, 9]

ソート

配列をソートするにはsortメソッドを使用する。

逆順にソートするメソッドはないのでいったんsortでソートしておいてreverseメソッドによって配列を逆順に並べ替える。

(*) reverseは配列の要素を逆順に並べ替えるだけで、逆順にソートするわけではない。

例)

data = [5,1,2,4,3]

p data.sort             # ソート

=> [1,2,3,4,5]

p data.sort.reverse     # 逆順ソート

=> [5,4,3,2,1]

p data.reverse          # 逆順に並び替える

=> [3,4,2,1,5]

引数として引き渡す/受け取る

メソッド呼び出し時に配列を引き渡す、あるいはメソッド定義において引数を配列で受け取る場合、配列名の先頭に「*」を付ける。

例)

def func(*args)
  args.sort.each {|arg|
    puts arg
  }
end

data = [3, 1, 2]

func(*data)

=> 1
=> 2
=> 3