Ruby

[Ruby]Arrayクラスのメソッド

1年くらい前にRubyの勉強のためにArrayクラスの便利メソッドをまとめたもの

参考
パーフェクトRuby
https://docs.ruby-lang.org/ja/latest/class/Array.html

要素の取得

values_at
複数の添字の要素を配列で返す

ary = [3, 4, 2, 8]
ary.values_at(0, 3, 4) # => [3, 8, nil]

sample
selfからランダムに要素を返す

ary = [3, 4, 2, 8]
ary.sample # => 2

# 引数を設定すると返す要素の個数を指定できる
array.sample(2) => [4, 2]

assoc
特定のキーを持つ要素を返す

ary = [[:ruby, 5], [:java, 3], [:c, 1]]
ary.assoc(:ruby) # => [:ruby, 5]

dig
深い階層にある値を引っこ抜く。keyが見つからない場合はnilが返る。
ネストしたHashや配列へのアクセスがしやすくなる。

# Hash
h = { foo: {bar: {baz: 1}}}
h.dig(:foo, :bar, :baz) # => 1
h.dig(:hoge)            # => nil

g = { foo: [10, 11, 12] }
g.dig(:foo, 1)          # => 11

# Array
a = [[4, [5, 6]]]

a.dig(0,1,0) # => 5
a.dig(0,1,1) # => 6
a.dig(0,1)   # => [5, 6]
a.dig(1)     # => nil
a.dig(0,0,0) # => TypeError: Integer does not have #dig method

配列の整形

compact
配列の要素からnilを取り除く

array = [false, nil, 0, '', [0, nil], []]
array.compact # => [false, 0, "", [0, nil], []]

uniq
配列から重複要素を取り除く

array = ['ruby', 'ruby', 2, 2.0, 2]
array.uniq # => ["ruby", 2, 2.0]

flatten
配列の階層を完全にフラットにする

array = [1, 2, [3, 4], 5]
array.flatten # => [1, 2, 3, 4, 5]

transpose
配列を行列に見立てて行と列の入れ替えを行う

array = [[1, 2, 3], ['北海道', '青森', '秋田']]
array.transpose # => [[1, "北海道"], [2, "青森"], [3, "秋田"]]

二分探索

bsearch
二分探索する。

array = [1, 2, 3, 5, 8]

array.bsearch { |n| n > 4 } # => 5
array.bsearch { |n| n > 9 } # => nil

要素の連結

join
配列を連結する

array = [1, 2, [3, 4], 5]
array.join # => "12345"
# セパレータとなる文字列を引数に指定も可能
array.join(',') # => "1,2,3,4,5"

# Array#*メソッドでも同じことが可能だけど暗号っぽくなるので非推奨(StyleGuideより)
array.*(',') # => "1,2,3,4,5"