Rubyメモ

Arrayで使えるメソッド

------------------------------------------------------------
# push n
配列の末尾に n を追加する(破壊的)

a=[1,2,3]
a.push(4,5)
a
=> [1, 2, 3, 4, 5]

------------------------------------------------------------
# pop
# pop(n)
配列から1つ取り除いて返す
または nで指定した数だけ配列から取り除き、その要素を配列で返す

返り値と残った値を使って、配列を分割するのにも使える

a = [1, 2, 3, 4, 5]
a.pop(3)
=> [3, 4, 5]
a
=> [1, 2]

------------------------------------------------------------
# shift
配列の先頭から要素を捨てて、配列を返す。

a=[1,2,3,4,5]
a.shift(3)
=> [1, 2, 3]
a
=> [4, 5]
------------------------------------------------------------
# unshift
配列の先頭に要素を追加する

a=[1,2,3,4,5]
a.unshift 6
=> [6, 1, 2, 3, 4, 5]


------------------------------------------------------------
# drop(n)
先頭のn要素を捨てた配列を返す
配列は書き換えない

a = [1,2,3,4,5]
a.drop(2)           #=> [3,4,5]

------------------------------------------------------------
# drop_while{|e| ....}
最初に偽になった要素までを捨てる
(最初に偽になった要素以降を取り出す)

a = [1,2,3,4,5]
a.drop_while{|i|i%3!=0}
=> [3, 4, 5]

see also take_while
------------------------------------------------------------
# each {|i| ... }

配列の要素に対し繰り返す

------------------------------------------------------------
# each_index {|i| ... }

配列のindexに対して繰り返す
for(i=0; i<N; i++) a[i]... 的な使い方ができる。

a=[3,1,4,1,5,9]
a.each_index.map{|i| "#{i}:#{a[i]},"}
=> ["0:3,", "1:1,", "2:4,", "3:1,", "4:5,", "5:9,"]

メモ:
a.map.with_index{|v,i| "#{i}:#{v},"}
=> ["0:3,", "1:1,", "2:4,", "3:1,", "4:5,", "5:9,"]
------------------------------------------------------------
# count(n)

nに一致する要素の数を返す

# count{|e| ... }

ブロックが真になった要素の数を返す

a = [3, 1, 4, 1, 5, 9]
a.count{|i| i%3 == 0}
=> 2

------------------------------------------------------------
# delete

配列から一致する要素を削除する

a = [3, 1, 4, 1, 5, 9]
a.delete(1)
a
=> [3, 4, 5, 9]

------------------------------------------------------------
# delete_at(n)

位置 n の要素を削除する

a=[3,1,4,1,5,9]
a.delete_at(-1)
a
=> [3, 1, 4, 1, 5]
------------------------------------------------------------
# delete_if{|i| ...}

条件に一致する要素を削除する

------------------------------------------------------------
# fill(val)

すべての要素を val にする

# fill(val, start, length)
# fill(val, range)

指定した範囲を val にする

a=[3,1,4,1,5,9]
a.fill(-1, 3..nil)
=> [3, 1, 4, -1, -1, -1]

------------------------------------------------------------

# filter{i| ... }
# select{|i|... }

各要素に対しブロックを評価し、真だった要素の配列を返す

------------------------------------------------------------

# index(n)
# find_index(n)
# index{|i| ... }
# find_index{|i| ... }

n に一致するまたは、ブロックが真を返す最初の位置を返す

a=[3,1,4,1,5,9]
a.index(1)
=> 1
a.index{|v|v>3}
=> 2


# rindex(n)
# rindex{|i) ...}

nに一致する最後の要素の位置を返す

a=[3,1,4,1,5,9]
a.rindex(1)
=> 3


------------------------------------------------------------
# first

配列の先頭の要素を返す。
Lisp でいえば car
(cdr は drop(1))

first(n) として複数要素を返すことができる

------------------------------------------------------------

# flatten 

配列を平たん化する

a="this is a pen".split.map(&:chars)
=> [["t", "h", "i", "s"], ["i", "s"], ["a"], ["p", "e", "n"]]
a.flatten
=> ["t", "h", "i", "s", "i", "s", "a", "p", "e", "n"]

------------------------------------------------------------

# include?(n)

配列が要素nを含むとき true, そうでないとき false を返す

------------------------------------------------------------

# insert(n, *val)

位置n の直前に val を追加する

a=[3,1,4,1,5,9]
a.insert(2, 11,12,13)
=> [3, 1, 11, 12, 13, 4, 1, 5, 9]

------------------------------------------------------------
# last
# last(n)

配列の最後の要素を返す

------------------------------------------------------------

# all? {|e| ... }

すべての要素が真のとき、真を返す

# any? {|e| ... }

1個以上の要素が真のとき、真を返す

# one? {|e| ... }

1個の要素が真のとき、真を返す

"XXXXOXXXX".chars.one?{|v|v=="O"}
=> true
"XXXXOXXXO".chars.one?{|v|v=="O"}
=> false


------------------------------------------------------------

# permutation(n)

順列を返す

a=[?a, ?b, ?c]
=> ["a", "b", "c"]
a.permutation(2).to_a
=> [["a", "b"], ["a", "c"], ["b", "a"], ["b", "c"], ["c", "a"], ["c", "b"]]

------------------------------------------------------------

# combination(n)

組み合わせを返す

a=[?a, ?b, ?c]
=> ["a", "b", "c"]
a.combination(2).to_a
=> [["a", "b"], ["a", "c"], ["b", "c"]]

------------------------------------------------------------

# rotate

指定した位置(省略時は1)の要素が先頭になる配列を生成し返す。

a
=> [3, 1, 4, 1, 5, 9]
a.rotate
=> [1, 4, 1, 5, 9, 3]
a
=> [3, 1, 4, 1, 5, 9]
a.rotate(-1)
=> [9, 3, 1, 4, 1, 5]

------------------------------------------------------------

# sample 

配列からランダムに1つ(引数を指定すれば複数)選んで返す

a=(1..6).to_a
a.sample
=> 4
a.sample
=> 2

------------------------------------------------------------

# slice(n)
# slice(n, length)
# slice(range)

Array#[] と同じ。
配列から指定した範囲の部分配列を返す

------------------------------------------------------------

# sort

ソートする。要素は <=> で比較する。

# sort_by

要素をそのまま <=> で比較するのではなくブロックの出力で比較する

"pencil".chars.sort_by{|c|c.ord}
=> ["c", "e", "i", "l", "n", "p"]

------------------------------------------------------------

# sum
# sum{|e| ... }

"abc".chars.sum{|c|c.ord}
=> 294
97+98+99
=> 294

------------------------------------------------------------

# take(n)

配列の先頭n要素を返す
n は省略できない。
n が2以上なら firstと同じ

------------------------------------------------------------

# take_while{|e| ... }

要素が偽になるまでの要素を配列で返す。
(先頭から数えて要素が真である範囲を返す)

a=[1,2,3,4,5,6]
a.take_while{|n|n<4}
=> [1, 2, 3]
a.take_while{|n|n>3}
=> []

------------------------------------------------------------

# to_h

配列をハッシュにする

[[:foo, :bar], [1, 2]].to_h
=> {:foo=>:bar, 1=>2}

> %w(uma shika inu neko).each_with_index.to_h
=> {"uma"=>0, "shika"=>1, "inu"=>2, "neko"=>3}

ブロックを指定するとそのブロックが返した [key, value]でハッシュを作る

 %w(uma shika inu neko).to_h{|w| [w, w.size]}
=> {"uma"=>3, "shika"=>5, "inu"=>3, "neko"=>4}

------------------------------------------------------------
# zip

> [1,2,3].zip(["a", "b", "c"])
=> [[1, "a"], [2, "b"], [3, "c"]]

w=%w(uma shika inu kaba)
=> ["uma", "shika", "inu", "kaba"]
(0...w.size).zip(w)
=> [[0, "uma"], [1, "shika"], [2, "inu"], [3, "kaba"]]


------------------------------------------------------------

# join
# *

%w(uma shika inu kaba).join("//")
=> "uma//shika//inu//kaba"

%w(uma shika inu kaba)*"//"
=> "uma//shika//inu//kaba"


------------------------------------------------------------
# |

和演算

[1, 1, 4, 2, 3] | [5, 4, 5]
#=> [1, 4, 2, 3, 5]


------------------------------------------------------------

# &

積演算

[3,1,4,1,5,9] & [1,7,3,2,0,5.0,8]
=> [3, 1]

------------------------------------------------------------

# + 

連結

[1,2,3] + [2,3,4,5]
=> [1, 2, 3, 2, 3, 4, 5]


------------------------------------------------------------

# -

減算。
減算される側の配列中の、減算する配列に含まれる要素はすべて削除される。

[1,2,3]-[2,3,4,5]
=> [1]

[1,2,2,3,3]-[2,3,4,5]
=> [1]