Ruby 配列関連のいろいろ

2018年6月20日水曜日

Ruby 配列

t f B! P L
Ruby 配列関連のいろいろ

Ruby 配列関連のいろいろ

配列(Array)の宣言

 # 4つの数値をもつ配列を作成
 ary = [1, 2, 3, 4]

 # Array.new で3つの要素持つ配列を作成
 # 各要素は nil で初期化される
 ary = Array.new(3)
 #=> [nil, nil, nil]

配列要素へのアクセス

配列インデックスは0〜始まります。
 ary = [1, 2, 4, 6]
 # 3番目の要素にアクセス
 p ary[2]
 #=> 4

 # 存在しない要素にアクセスした場合は、nilが返ります
 p ary[10]
 #=> nil

 # 2番目の要素の値を変更します
 ary[1] = 100
 p ary[1]
 #=> 100

first

配列の先頭要素を取得します。
空の配列の場合、nil が返ります。
 ary = [1, 2, 4, 6]
 p ary.first
 #=> 1

first(n)

先頭の n 要素を配列で返します。n は 0 以上でなければなりません。
 ary = [1, 2, 4, 6]
 # 先頭の2要素を配列で取得
 p ary.first(2)
 #=> [1, 2]

last

配列の最終要素を取得します。
空の配列の場合、nil が返りるのは first と同じ

last(n)

末尾の n 要素を配列で返します。n は 0 以上でなければなりません。
使用方法は first(n) と同じです。

繰り返し処理

each / each_index / each_with_index

配列要素数分、指定したブロックを実行します。
呼び出す関数よって、ブロックに渡される引数が以下の通り変わります。
 ary = [2, 4, 6, 8]
 
 # [each関数] ブロックの引数には、各要素の値が入る
 ary.each { |v| p v }
  #=> 2 4 6 8
  
 # [each_index関数] ブロックの引数には、配列インデックスの値が入る
 ary.each_index { |i| p i }
  #=> 0 1 2 3
  
 # [each_with_index関数] ブロックの引数には、配列の値と、インデックスの2つが入る
 ary.each_with_index { |v,i| p "index=#{i} value=#{v}" }
  #=> index=0 value=2
  #=> index=1 value=4
  #=> index=2 value=6
  #=> index=3 value=8

要素の検索

select / find_all

ブロック内の式が trueになる要素だけを抽出します。
find_all は select と同義です。
trueになる要素がない場合は空の配列が返ります。
 # 2で割り切れるものを抽出する
 ary = [1, 2, 3, 4, 5, 6]
 ary.select { |n| n % 2 == 0 }
 # => [2, 4, 6]

 # 9で割り切れるものがないので空の配列が返る
 ary.select { |n| n % 9 == 0 }
 # => []

 # hashの検索
 # - valueが1のものを抽出する
 {:a => 1, :b => 2}.select { |k, v| v == 1 }
 # => {:a => 1}

reject

selectの反対で、ブロック内の式が falseになる要素だけ を抽出します。
これも、falseになる要素がない場合は空の配列が返ります。
 # 2で割り切れるものじゃないものを抽出する
 ary = [1, 2, 3, 4, 5, 6]
 ary.reject { |n| n % 2 == 0 }
 # => [1, 3, 5]

find / detect

ブロック内の式がtrueになった 最初の要素 を検索して返します。
detectfind と同義です。
trueになる要素がない場合はnilが返ります。
# 最初の3を探す
ary = [1, 3, 4, 3, 5]
ary.find { |n| n == 3 }
# => 3

# 該当する要素がない場合 nil が返る
ary.find { |n| n == 10 }
# => nil

grep

grepの引数に マッチする要素だけ を抽出します。
引数には正規表現が使えます。
マッチする要素がない場合は空の配列が返ります。
# 数字を含むものを抽出する
['a1', 'bb', 'c2', 'dd', '5e'].grep(/[0-9]/)
# => ["a1", "c2", "5e"]

# 大文字の英語を含むものがないので空の配列が返る
['a1', 'bb', 'c2', 'dd', '5e'].grep(/[A-Z]/)
=> []
ちなみに、要素の位置を知りたい場合は find_index を使えばOKです。
# 最初の3の倍数の位置を探す
[1, 5, 8, 2, 6, 3].find_index { |n| n % 3 == 0 }
# => 4

要素の追加

push / append

配列の末尾に、引数で指定した値を追加します。
 ary = [1, 2, 3, 4]
 ary.push(5)
 #=> [1, 2, 3, 4, 5]
引数を複数指定すると、指定された順番に配列の末尾に追加します。
 ary = [1, 2, 3, 4]
 ary.push(5, 6)
 #=> [1, 2, 3, 4, 5, 6]

要素の削除

delete

引数で指定した値と等しい値を持つ要素を削除します。
 ary = [1, 4, 5, 4, 2]
 ary.delete(4)
 => [1, 5, 2]

delete_at

指定した配列インデックスの要素を削除します。
 ary = [1, 4, 5, 4, 2]
 ary.delete_at(1)
 => [1, 5, 4, 2]

delete_if

ブロックの結果が true の要素をすべて削除します。
戻り値には self が返ります。
 ary = [1, 4, 5, 4, 2]
 ary.delete_if { |v| v == 4 || v == 5 }
 => [1, 2]

最大・最小・合計・平均値を求める

max (最大値)

 ary = [1, 2, 3, 4]
 # max 関数で最大値を求める
 p ary.max  #=> 4

min (最小値)

 # min 関数で最小値を求める
 p ary.min  #=> 1

sum (合計値)

 # sum 関数で最大値を求める
 p ary.sum  #=> 10

平均値は inject を応用

 # 平均値は inject 関数を使用して求める
 p ary.inject(0.0){ |r,i| r += i } / ary.size  #=> 2.5

要素の並び替え

reverse (要素の反転)

 ary = [1,2,3,4]
 # 要素を反転させた新しい配列を作成
 new_ary = ary.reverse

 # 自身の配列そのものを反転させる場合は、 reverse! を使用する 
 ary.reverse!

sort (ソート)

 ary = [4, 3, 2, 1]
 # 昇順にソートした新しい配列を作成
 sort_ary = ary.sort   #=> [1, 2, 3, 4]
 
 # 自身の配列そのものをソート
 ary.sort   #=> [1, 2, 3, 4]
 
 # 降順でソートする関数は用意されていないため、ブロックでソート条件を指定
 ary.sort { |x1, x2| (-1) * (x1 <=> x2) }
 #=> [4, 3, 2, 1]
補足
<=> 比較演算子は、
x1 < x2 の場合 -1を、
x1 = x2 の場合 0を、
x1 > x2 の場合 1を返します。

sort_by (ソート対象の項目を指定してソート)

 ary = [{:key => "foo"}, {:key => "bar"}, {:key => "zaz"}, {:key => "yux"}]
 # 各要素の downcase の昇順で並び替えた作成を作成する
 sort_ary = ary.sort_by { |v| v[:key] }
 # => ["bar", "foo", "yux", "zaz"]
 
 # 自身の配列そのものをソート
 ary.sort_by! { |v| v[:key] }
 # => ["bar", "foo", "yux", "zaz"]
スポンサーリンク

QooQ