[adsense]
配列(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
[adsense]
要素の検索
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になった 最初の要素 を検索して返します。
detect
は find
と同義です。
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]
[adsense]
最大・最小・合計・平均値を求める
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"]
0 件のコメント:
コメントを投稿