【Ruby超入門】配列の基礎的なメソッド集
今回は Ruby の配列によく使うようなメソッドをまとめてみたので参考にしてみてください。
また、他に便利なメソッドなどがあれば是非コメントしてください。
配列とは
["Ruby", "PHP", "Java"]
配列は複数のデータをまとめて格納できるオブジェクトです。
配列内の要素は順番に並んでいて、添え字(インデックス)を指定することでそのデータを取り出すことができます。
- 配列は []の中にカンマ区切りで複数のオブジェクトを書いていく
- 中身が無い場合は空の配列ができる
- 種類の違うオブジェクトも入れられる
- 変数に代入する場合は複数形で命名する
配列の要素を取得
配列は変数の後に [n]などのインデックス番号をつけることで取得できます。
この [n]の中のインデックス番号は配列の先頭からを示しているのですが、注意としては 0 番目から始まるということです。
1 番目の「Ruby」は [0]で、3 番目の「Java」は [2]となります。
languages = ["Ruby", "PHP", "Java"]
puts languages[0] #=> Ruby
puts languages[2] #=> Java
[n]の番号に -(マイナス)をつけることで後ろの要素からできます。
languages = ["Ruby", "PHP", "Java"]
puts languages[-1] #=> Java
puts languages[-2] #=> PHP
要素以上の番号で指定した場合は nil が返ってきます。
nil は「何もない」ことを表すオブジェクトです。
languages = ["Ruby", "PHP", "Java"]
puts languages[3] #=> nil
要素を取得、追加、削除するメソッド
first、last
first は [0]と同じで、配列の先頭の要素を取得するメソッドです。
last は [-1]と同じで、配列の末尾の要素を取得するメソッドです。
languages = ["Ruby", "PHP", "Java"]
puts languages.first #=> Ruby
puts languages.last #=> Java
push、unshift
push は配列の末尾へ要素を追加するメソッドです。
unshift は配列の先頭に要素を追加するメソッドです。
languages = ["Ruby"]
languages.push("PHP")
#=> ["Ruby", "PHP"]
languages.unshift("Java")
#=> ["Java", "Ruby", "PHP"]
pop、shift
pop は配列の末尾から要素を 1 つ削除するメソッドです。
shift は配列の先頭から要素を 1 つ削除するメソッドです。
languages = ["Java", "Ruby", "PHP"]
languages.pop
#=> "PHP"
p languages
#=> ["Java", "Ruby"]
languages.shift
#=> "Java"
p languages
#=> ["Ruby"]
配列の足し算と引き算
足し算
配列で足し算をすると、2 つの配列をつなげて新しい配列を作ります。
a = [1, 2, 3]
b = [4, 5]
p a + b
#=> [1, 2, 3, 4, 5]
languages_a = ["Ruby", "PHP"]
languages_b = ["Java", "JavaScript"]
p languages_a + languages_b
#=> ["Ruby", "PHP", "Java", "JavaScript"]
引き算
配列で引き算をすると、元の配列から要素を取り除いた新しい配列を作ります。
引き算は配列 a と配列 b を比べて、配列 a にだけある要素を得ることができます。
a = [1, 2, 3]
b = [1, 3, 5]
p a - b
#=> [2]
languages_a = ["Ruby", "PHP", "Java", "JavaScript"]
languages_b = ["Java", "JavaScript"]
p languages_a - languages_b
#=> ["Ruby", "PHP"]
その他の便利なメソッド
- size
- sum
- uniq
- sample
- shuffle
- sort
- join
- split
配列の要素数を得る(size)
size は配列の要素数を返します。
puts [1, 2, 3].size #=> 3
配列の全要素の合計を得る(sum)
sum は配列の全要素を足した値を返します。
puts [1, 2, 3].sum #=> 6
先ほどの size と組み合わせると、平均値の計算ができます。
a = [1, 2, 3]
puts a.sum / a.size #=> 2
配列の重複している要素を取り除く(uniq)
uniq は重複している要素を取り除いた配列を返します。
p [1, 3, 2, 2, 3].uniq #=> [1, 3, 2]
配列の要素をランダムに取得する(sample)
sample は配列の要素を 1 個ランダムに選んで返します。
puts [1, 2, 3].sample #=> 2
puts [1, 2, 3].sample #=> 1
puts [1, 2, 3].sample #=> 1
puts [1, 2, 3].sample #=> 3
引数を指定した場合は要素数を超えない範囲で取得できます。
p [1, 2, 3, 4].sample(2) #=> [1, 3]
p [1, 2, 3, 4].sample(2) #=> [4, 1]
p [1, 2, 3, 4].sample(2) #=> [1, 2]
p [1, 2, 3, 4].sample(2) #=> [1, 4]
配列の要素をランダムに並び替える(shuffle)
shuffle は配列の要素をランダムに並び替えます。
p [1, 2, 3].shuffle #=> [3, 1, 2]
p [1, 2, 3].shuffle #=> [2, 3, 1]
p [1, 2, 3].shuffle #=> [2, 1, 3]
配列の要素を順番に並び替える(sort)
sort は配列の要素を順番に並び替えます。
配列の要素が数値の時は小さい順に並び替えて、文字列の時は abc 順に並び替えます。
p [3, 1, 2].sort #=> [1, 2, 3]
p [2, 3, 1].sort #=> [1, 2, 3]
p [2, 1, 3].sort #=> [1, 2, 3]
p ["aya", "jun", "ichiro"].sort #=> ["aya", "ichiro", "jun"]
p ["jun", "aya", "ichiro"].sort #=> ["aya", "ichiro", "jun"]
p ["ichiro", "aya", "jun"].sort #=> ["aya", "ichiro", "jun"]
また文字列は先頭の文字で比較し、同じであれば2文字目と比較していきます。
大文字が混じると「大文字が先、小文字が後」となります。
p ["Yuki", "aya", "Ichiro", "aki", "Ai"].sort
#=> ["Ai", "Ichiro", "Yuki", "aki", "aya"]
sort に reverse を使うと並び順を逆にできます。
p [3, 1, 2].sort.reverse
#=> [3, 2, 1]
p ["Yuki", "aya", "Ichiro", "aki", "Ai"].sort.reverse
#=> ["aya", "aki", "Yuki", "Ichiro", "Ai"]
配列中の文字列を連結する(join)
join は配列中の文字列を連結します。引数を指定すると、要素の間に指定した引数を入れて連結できます。
puts ["Ruby", "PHP", "Java"].join
#=> RubyPHPJava
puts ["Ruby", "PHP", "Java"].join("と")
#=> RubyとPHPとJava
配列中の文字列を分割する(split)
split はスペース区切りになっている文字列を配列にして返します。引数を指定すると、スペース以外の文字にも対応できます。
p "Ruby PHP Java".split
#=> ["Ruby", "PHP", "Java"]
p "RubyとPHPとJava".split("と")
#=> ["Ruby", "PHP", "Java"]
ブロックを使う配列のメソッド
- each
- map
- select/reject
- find
配列の繰り返し処理(each)
each は配列の要素を1つずつ順番に取り出します。
取得した要素を変数に格納し、ブロック内で記述した処理を実行します。
numbers = [1, 2, 3]
numbers.each do |n|
puts n
end
#=> 1
#=> 2
#=> 3
配列 [1, 2, 3]の値を順番に変数 n へ代入して、ブロック内で出力処理をしています。
またブロックは以下のように 1 行で書くこともできます。
numbers = [1, 2, 3]
numbers.each { |n| puts n }
#=> 1
#=> 2
#=> 3
配列の各要素を変換(map)
map は配列の要素を繰り返し、ブロック内で実行した戻り値を配列にして返します。
戻り値が配列になるだけなので、変数の値自体は変わりません。
numbers = [1, 2, 3, 4, 5]
# 各要素を10倍にする
numbers.map { |n| n * 10 }
#=> [10, 20, 30, 40, 50]
p numbers #=> [1, 2, 3, 4, 5]
ブロックの戻り値が配列の要素となるため、map の戻り値をそのまま新しい変数に入れることができます。
numbers = [1, 2, 3, 4, 5]
# ブロックの戻り値を変数に代入する
new_numbers = numbers.map { |n| n * 10 }
p numbers #=> [1, 2, 3, 4, 5]
p new_numbers #=> [10, 20, 30, 40, 50]
配列の各要素を真偽値によって変換(select/reject)
select はブロックの戻り値が真(true)の要素を返し、新しい配列を作ります。
numbers = [1, 2, 3, 4, 5, 6]
# ブロックの戻り値がtrueになった要素だけが集められる
numbers.select { |n| n.even? }
#=> [2, 4, 6]
p numbers #=> [1, 2, 3, 4, 5, 6]
reject は select の反対で、ブロックの戻り値が偽(false)の要素を返し、新しい配列を作ります。
numbers = [1, 2, 3, 4, 5, 6]
# 3の倍数を除外する(3の倍数以外を集める)
numbers.reject { |n| n % 3 === 0 }
#=> [1, 2, 4, 5]
p numbers #=> [1, 2, 3, 4, 5, 6]
配列の最初の要素を真偽値によって変換(find)
find はブロックの戻り値が真(true)になった最初の要素を返します。
numbers = [1, 2, 3, 4, 5, 6]
# ブロックの戻り値が最初にtrueになった要素を返す
numbers.find { |n| n.even? }
#=> 2
ブロックを簡潔に書く(&:)
map や select などにブロックを渡す代わりに、map(&:メソッド名) といった引数を渡せば、ブロックを簡潔に書くことができます。
ただし以下の条件が揃った時のみ可能です。
- ブロック引数が 1 個だけである。
- ブロックの中で呼び出すメソッドには引数がない。
- ブロックの中では、ブロック引数に対してメソッドを 1 回呼び出す以外の処理がない。
# このコードは、
["ruby", "php", "java"].map { |s| s.upcase }
#=> ["RUBY", "PHP", "JAVA"]
# こう書き換えられる
["ruby", "php", "java"].map(&:upcase)
#=> ["RUBY", "PHP", "JAVA"]
# このコードは、
[1, 2, 3, 4, 5, 6].select { |n| n.odd? }
#=> [1, 3, 5]
# こう書き換えられる
[1, 2, 3, 4, 5, 6].select(&:odd?)
#=> [1, 3, 5]
まとめ
意外とメソッドが多く大変かもしれませんが、map などはよく使うと思うので忘れそうになったらこの記事を参考にしてくれたら幸いです。
Discussion