Ruby 配列関連のいろいろ

2021年11月23日火曜日

Ruby

t f B! P L
配列

[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になった 最初の要素 を検索して返します。
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]

[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"]
スポンサーリンク
スポンサーリンク

このブログを検索

Profile

自分の写真
Webアプリエンジニア。 日々新しい技術を追い求めてブログでアウトプットしています。
プロフィール画像は、猫村ゆゆこ様に書いてもらいました。

仕事募集もしていたり、していなかったり。

QooQ