💎

Ruby Arrayチートシート

2024/04/21に公開

概要

RubyのArrayチートシート

配列の作成

コード 内容 リンク
Array.new(n, v) 要素数n 値vの配列を作成 LINK
(n..m).to_a nからmまでの整数配列を作成
(n..m).step(s).to_a nからmまでs刻みの整数配列を作成
配列の作成(例)
Array.new(n, v)
Array.new(3, "A") # => ["A", "A", "A"]
# それぞれの要素を別オブジェクトにしたい場合は、ブロックを用いる
Array.new(3){Array.new(2, 0)} # => [[0, 0], [0, 0], [0, 0]]
(n..m).to_a
(1..4).to_a # => [1,2,3,4]
(1...4).to_a # => [1,2,3]
(1..10).step(3).to_a # => [1,4,7,10]

要素の取得

コード 内容 リンク
arr[n] n番目の要素を取得 LINK
arr[n,m] n番目からm個分の要素を取得 LINK
arr[n..m] n番目からm番目までの要素を取得 LINK
arr[n...m] n番目からm-1番目までの要素を取得 LINK
arr.values_at(n,m,...) n,m,...番目の要素を取得 LINK
arr.last(n) 最後からn個の要素を取得
arr.first(n) 先頭からn個の要素を取得
要素の取得(例)
arr = [1,2,3,4,5]

# 1番目の要素を取得
arr[1] # => 2

# 1番目から3つの要素を取得
arr[1,3] # => [2,3,4]

# 2~4番目の要素を取得
arr[2..4] # => [3,4,5]

# 複数要素を取得
arr.values_at(0,2,4) # => [1,3,5]
arr.values_at(*[0,2,4]) # 同じ

# 最後の要素をn個取得
arr.last(2) # => [4,5]

# 先頭の要素をn個取得
arr.first(2) # => [1,2]

配列の結合

コード 内容 リンク
arr1 + arr2 要素を結合
arr1.concat(arr2) 要素を結合(破壊的)
arr1 | arr2 重複なしで結合
arr1 - arr2 arr1から重複を削除
arr1 & arr2 共通項を取得
配列の結合(例)
arr1 + arr2
a = [1,2]
b = [3,4,5]
a + b # => [1,2,3,4,5]
arr1.concat(arr2)
a = [1,2]
b = [3,4,5]
a.concat(b)
p a # => [1,2,3,4,5]
arr1 |-& arr2
a = [1,2,3]
b = [3,4,5]

# 重複なしで結合
p a | b # => [1,2,3,4,5]

# 要素を除外
p a - b # => [1,2]

# 共通項を取得
p a & b # => [3]

多重代入

コード 内容 リンク
a,b,... = arr 各要素をa,b,...に代入
a,*b = arr 残りの要素をbに代入
多重代入(例)
x = [1,2,3,4]
# 足りない要素は代入されない
a, b = x
p a # => 1
p b # => 2

# *で残りの要素を全てbに代入
a, *b = x
p a # => 1
p b # => [2,3,4]

# *は要素の途中でも使える
a, *b, c = x
p a # => 1
p b # => [2,3]
p c # => 4

splat演算子

コード 内容 リンク
f(*arr) arrを引数のように展開 LINK
splat演算子(例)
# どちらも同じ
arr.push(1, 2)
arr.push(*[1, 2])

case x
  # どちらも同じ
when 'A', 'B'
when *['A', 'B']

要素の追加・削除

コード 内容 リンク
arr.push(x,y,...) 要素x,y,...を末尾に追加
arr << x << y <<... 要素x,y,...を末尾に追加
arr.unshift(x,y,...) 要素x,y,...を先頭に追加
arr.insert(i, v) 要素vをi番目に追加
arr.delete(v) 値がvの要素を削除
arr.delete_if{|x| x} ブロック評価がtrueの要素を削除
要素の追加・削除(例)
push, <<
a = [1,2,3]
a.push(4) # [1,2,3,4]
a << 5 # [1,2,3,4,5]

# 複数要素を追加
a2 = [1,2,3]
a2.push(4,5) # [1,2,3,4,5]
# a2 << 4 << 5 と同じ
unshift, insert
# 先頭に追加
b = [1,2,3]
b.unshift(0) # [0,1,2,3]

# 任意の位置に追加
c = [1,2,3]
c.insert(2, 99) # [1,2,99,3]
delete
a = ['A', 'B', 'C']
a.delete('B')
p a # => ["A", "C"]
delete_if
a = [1,2,3,4,5,6]
a.delete_if do |n|
  # 奇数のみ削除
  n.odd?
end
p a # => [2, 4, 6]

ループ

コード 内容 リンク
arr.each{|v| ... } 各要素をブロックに渡す
arr.each_with_index{|v, idx| ... } インデックス付きでブロックに渡す
(n..m).each{|n| ... } nからmまでの整数をブロックに渡す
(n..m).step(s).each{|v| ... } nからmまでs刻みの整数をブロックに渡す
n.times{|v| ... } 0からn-1までの値をブロックに渡す(n回ループ)
n.upto(m){|v| ... } nからmまでの整数をブロックに渡す
n.downto(m){|v| ... } nからmまでの整数をブロックに渡す
ループ(例)
each
arr = [1,2,3]
arr.each{|n| puts n} #=> 1 2 3
each_with_index
arr = ["A", "B", "C"]
arr.each_with_index{|v,idx| puts "#{idx}:v"} # => "0:A" "1:B" "2:C"
(n..m).each, step
(1..4).each{|n| puts n} # => 1 2 3 4
(1...4).each{|n| puts n} # => 1 2 3
(1..10).step(3){|n| puts n} # => 1 4 7 10
times
3.times{print"Hey!"} # => Hey!Hey!Hey!
upto, downto
5.upto(7){|n| puts n} # => 5 6 7
7.upto(5){|n| puts n} # => 7 6 5
5.step(10, 2){|n| puts n} # => 5 7 9

配列の探索

コード 内容 リンク
arr.map{|v| ... } 各要素を評価し、新しい配列を生成
arr.map.with_index{|v, idx| ... } 各要素評価し、新しい配列を生成(インデックス付)
arr.select{|v| ... } 条件を満たす要素を返却
arr.reject{|v| ... } 条件を満たさない要素を返却
arr.find{|v| ... } 条件を満たす最初の要素を返却
arr.sum{|v| ... } 各要素の合計を取得
配列の探索(例)
map
# 各要素を評価し、新しい配列を返却
a = [1,2,3]
b = a.map{|n| n * 10}
p b # => [10, 20, 30]
map.with_index
a = ["A", "B", "C"]
b = a.map.with_index{|x, i| "#{i}: #{x}"}
p b # => ["0: A", "1: B", "2: C"]
select, reject
# 条件を満たす要素を返却
a = [1,2,3]
b = a.select {|n| n >= 2}
p b # => [2,3]

# 条件を満たさない要素を返却
a = [1,2,3]
b = a.reject {|n| n >= 2}
p b # => [1]
find
# 条件を満たした最初の要素を返却
a = [1,2,3]
b = a.find{|n| n >= 2}
p b # => 2
sum
# 各要素の合計を取得
a = [1,2,3]
b = a.sum
p b # => 6

# ブロックも指定可能
a = [1,2,3]
b = a.sum{|n| n**2}
p b # => 14

文字列

コード 内容 リンク
arr.join(s) 各要素を文字列sで結合
文字列(例)
join
# 各要素を結合
a = [1,2,3]
p a.join("+") # => "1+2+3"

参考リンク

Rubyリファレンス: class Array
Rubyリファレンス: class Range

Discussion