Rubyの配列まとめ
[履歴] [最終更新] (2014/02/01 12:36:56)

概要

Rubyの基本的なコンテナオブジェクトには配列とハッシュがあり、ともにオブジェクトへの参照を格納します。
ここでは配列についてみてみます。Rubyの配列はPerlの無名配列と似ています。

sample.rb

str = "This is a string."
num = 0
array = [num,1,2,str]
str[-1] = '?'
num = 999

array.each do |var|
  puts var
end

出力例

$ ruby sample.rb 
0
1
2
This is a string?

strを更新、つまりarrayの第3要素の参照先を間接的に更新したことで、ピリオド'.'がクエスチョンマーク'?'に変更されて出力されました。
一方でnumに新しいオブジェクトを代入しても、これまでnumに代入してあったオブジェクト自体を更新したことにはならないため0は0のままです。

配列へのアクセス

sample.rb

array = [0,1,2,3,4,5,6,7,8,9]
p array[2,3]
p array[2..4]

出力例

$ ruby sample.rb
[2, 3, 4]
[2, 3, 4]

配列への代入

sample.rb

array = [0,1,2]

array[10] = 9  # 残りはnilで埋まります。
p array

array[3..10] = nil,nil  # [3],...,[10]がnil,nilで置換されます。
p array

array[3,2] = 'a','b','c','d'  # [3],[4],[5]がa,b,c,dで置換されます。
p array

出力例

$ ruby sample.rb 
[0, 1, 2, nil, nil, nil, nil, nil, nil, nil, 9]
[0, 1, 2, nil, nil]
[0, 1, 2, "a", "b", "c", "d"]

比較

配列の比較は全要素が等しい場合にtrueとなります。

sample.rb

a = [1,2,'a']
b = [1,2,'a']
puts "a == b" if a==b

出力例

$ ruby sample.rb 
a == b

便利なメソッド

Arrayオブジェクトの便利なメソッドを示します。

sample.rb

array = [1,2,3]
p array.size
p array.length

array *= 3
p array

p array.include? 2
p array.sort
p array.uniq
p array       # もとの配列はそのまま

array.sort!   # '!': 配列を破壊的に操作
p array
array.uniq!
p array

# 結合して文字列生成
expression = array.join(' + ')

# inject(初期値), 配列をイテレート, subtotal: 前回ループの結果または初期値, val: 配列要素
total = array.inject(0){|subtotal, val| subtotal+val}
puts "#{expression} = #{total}"

# push,pop,unshift,shift
array = ['middle']
array.push 456
array.unshift 123
p array
p array.pop
p array
p array.shift
p array

出力例

3
3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
true
[1, 1, 1, 2, 2, 2, 3, 3, 3]
[1, 2, 3]
[1, 2, 3, 1, 2, 3, 1, 2, 3]
[1, 1, 1, 2, 2, 2, 3, 3, 3]
[1, 2, 3]
1 + 2 + 3 = 6
[123, "middle", 456]
456
[123, "middle"]
123
["middle"]

イテレータ

sample.rb

array = [1,2,3]

array.each do |val|
  puts val
end

array.each_with_index do |val,i|
  puts "#{i}: #{val}"
end

出力例

$ ruby sample.rb 
1
2
3
0: 1
1: 2
2: 3

全要素を一度に操作

Perlなどにもあるmapが実装されています。

sample.rb

array = [1,2,3]
p array.map{|val| val*2}

出力例

$ ruby sample.rb 
[2, 4, 6]

メソッドを一つ呼ぶだけのシンプルなケースであればショートカット記法があります。

sample.rb

array = [1,2,3]
p array.map{|val| val.class}
p array.map(&:class)

出力例

$ ruby sample.rb 
[Fixnum, Fixnum, Fixnum]
[Fixnum, Fixnum, Fixnum]

抽出

Perlなどにおけるgrepに相当するselectが実装されています。

sample.rb

array = [1,2,3,4,5]
p array.select{|val| val%2==0}

出力例

$ ruby sample.rb 
[2, 4]

ソートをもっと詳しく

何をもとに評価してソートするかを記述できます。

sample.rb

array = [['a',100],['c',200],['b',50]]
p array.sort{|x,y| x[1] <=> y[1]}
p array.sort{|x,y| x[0] <=> y[0]}

出力例

$ ruby sample.rb 
[["b", 50], ["a", 100], ["c", 200]]
[["a", 100], ["b", 50], ["c", 200]]
関連ページ