Ruby/配列操作

Ruby/配列操作

初期化

普通に配列を作る

hoge = Array.new();

リテラルで配列を作る

hoge = [1, 2, 3]

メタ情報取得

配列の長さ(要素数)を得る

hoge = [1, 2, 3]
p hoge.size #=> 3

ちなみに JavaScript のように長さをゼロに設定して配列要素を消すという操作はできない。

検索系

存在を確認する

要素を含むかどうかを確認する。比較には == が使われる

hoge = [1, 2, 3]
p hoge.include?(2) #=> true

要素追加

末尾に追加

<< という演算子っぽいメソッドを使うと末尾に要素追加できる。直感的。

hoge = Array.new();
hoge << "aaa"
hoge << "bbb"
p hoge #=> ["aaa", "bbb"]

2つの配列を破壊的に結合する

hoge = [1,2,3]
piyo = [5,6,7]
hoge.concat(piyo)
p hoge #=> [1,2,3,4,5,6]

2つの配列を結合し新たな配列を作る(非破壊的)

hoge = [1,2,3]
piyo = [4,5,6]
fuga = hoge + piyo
p fuga #=> [1,2,3,4,5,6]
p hoge #=> [1,2,3]

要素抽出

要素の範囲を指定して抽出

Rangeを使って指定できる。ゼロからスタート。

p [1,2,3,4][1..2] #=> [2,3]

先頭要素を取得して先頭要素を削除

つまりスタック構造の取り出し操作。LIFO: Last In First Out を実現する。要素がなくなったら nil を返す。

a = [1,2,3]
p a.shift #=> 1
p a.shift #=> 2
p a #[3]
 
p a.shift #=> 3
p a.shift #=> nil
p a.shift #=> nil

先頭の要素を取得

先頭だけは特別に first というメソッドで取得できるようになっている

hoge = [1, 2, 3]
hoge.first #=> 1

末尾の要素を取得

末尾だけは特別に last というメソッドで取得できるようになっている

hoge = [1, 2, 3]
hoge.last #=> 3

条件に合致する最初の1要素を取得

hoge = [1, 2, 3]
piyo = hoge.find do |a|
  a == 2
end
p piyo #=>2

条件に合致したすべての要素を配列で取得

hoge = [1, 2, 3]
piyo = hoge.find_all do |a|
  a >= 2
end
p piyo #=>[2, 3]

find_allselect という別名も持っているので文脈によって使い分けるといいかも

削除系

nilだけを削除する

非破壊的バージョン

a = [nil, nil, 123].compact
p a #=> [123]

破壊的バージョン

a = [nil, nil, 123]
a.compact!
p a #=> [123]

重複を取り除く SQLでいうdistinct

非破壊的

hoge = [1, 2, 2, 3, 3, 2, 1]
hoge = hoge.uniq
p hoge #=> [1, 2, 3]

破壊的

hoge = [1, 2, 2, 3, 3, 2, 1]
hoge.uniq!()
p hoge #=> [1, 2, 3]

合致する要素を削除

hoge = [1, 2, 3]
hoge.delete(2)
p hoge #=> [1, 3]

このメソッドでは破壊的に取り除かれる

位置を指定して削除

delete_atメソッドの戻りは削除した値で、削除は破壊的に行われる。

hoge = [1, 2, 3]
hoge.delete_at(1)
p hoge #=> [1, 3]

最後の要素を削除

位置を指定して削除の応用

hoge = [1, 2, 3]
hoge.delete_at(-1)
p hoge #=> [1, 2]

ソート系

安定ソートする

sort_byメソッドをうまく使うとできるっぽ

a = [[1,3],[1,2],[1,1],[2,3],[2,2],[2,1]]
i = 0
a = a.sort_by do |b|
  [b[1], i += 1]
end
i = 0;
a = a.sort_by do |b|
  [b[0], i += 1]
end
p a #=>[[1,1],[1,2],[1,3],[2,1],[2,2],[2,3]]

Ruby/配列操作/sort_by メソッドを読む

ランダムにソートする

つまりシャッフルする

[1,2,3].sort_by{rand}

・・・らしい

集合演算

RubyのArrayは便利なもんで順番がある箱ではなく値の集合として扱うことができる。

共通部分を削除する 差集合

-演算子なのでベースは左辺になる。非破壊的

a = [1, 2, 3, 4]
b = [2, 4]
p a - b #=>[1, 3]

共通部分を取り出す 積集合

a = [1, 2, 3, 4]
b = [2, 4]
p a & b #=>[2, 4]

列挙処理

列挙された項目を集める

一言でこの機能を言うのは難しいけど、配列でループしてその中で処理した値を集めてまた配列にするという処理。全要素をあますことなく処理するときに使う。

a = [1,2,3,4,5].collect do |b|
  b * 10
end
p a #=> [10,20,30,40,50]

要素数の増減を伴う処理をやりたいときは find_all とか select を使うといいかな

ruby/array_ope.txt · 最終更新: 2016-12-30 17:53 by ore