記事【Ruby】配列と操作(基本編)にて、Rubyにおける配列の基本的な内容を解説しました。しかし、配列に関係する操作やメソッドは他にも多数あります。
本記事では、基本編で紹介しきれなかった内容をお伝えします。ぜひマスターして、最高に効率的なプログラムを作れるようになってくださいね!
目次
配列をeachで回す
要素を順番に取り出す方法を解説します。配列はeachというメソッドが使えます。他言語経験者にはイテレータといえばわかりやすいでしょうか。これを利用して、要素を取り出しつつ出力してみましょう。
以下が基本書式です。
配列.each do |配列の要素を受ける変数| // 配列の要素を使った処理 end
では実際に使ってみましょう。各要素を取り出して表示しつつ、すべての要素が終わると自動的に終了させます。
array = ["a", "b", "c", "d", "e", "f"] array.each do |value| puts value end
[実行結果]
a b c d e f
配列の要素を順番に取り出し、処理(この場合は表示)できました。
Rubyの配列をソートする
配列の中身をソート(大きい順や小さい順など、何らかの規則に基づき並び替える)する方法をいくつか解説します。
sortメソッド
配列を昇順(小さいものから大きいものの順に並べる)に並び替えます。まずはsortメソッドです。
array = [“a”, “b”, “f”, “d”, “e”]
p array.sort
[実行結果]
["a", "b", "d", "e", "f"]
もちろん、数値でも可能です。
array = [5, 2, 4, 3, 9] p array.sort
[実行結果]
[2, 3, 4, 5, 9]
sortは表示だけソートしますが、破壊的メソッドsort!もあります。
破壊的メソッドとは、【Ruby入門】最初はこれだけ!まずは手を動かしたい人のRuby入門を参照してください。
配列を逆順にするreverse
配列を逆順にする場合は、reverseを使います。
array = [5, 2, 4, 3, 9] p array.reverse
[実行結果]
[9, 3, 4, 2, 5]
逆順になりました。
values_atで飛び飛びに要素を取って配列を作る
配列の要素数が多くなったとき、要素番号を指定して、新たに配列を作れると便利ですよね。そんな方法を解説します。
values_atを使います。
array = ["a", "b", "f", "d", "e"] p array.values_at(1,2,4)
[実行結果]
["b", "f", "e"]
指定した要素だけを取り出して、新たに配列を作れました。
不要な要素を削除する
条件を指定して削除
今度は、不要なものだけを消すdelete_ifを解説します。奇数の要素だけを消しましょう。
array = [1,2,3,4,5,6,7,8,9] array.delete_if{|i| i%2 == 1} p array
[実行結果]
[2, 4, 6, 8]
条件に合致するもの、つまり「i % 2 == 1」とすることで、奇数の要素を消しました。
先ほどのvalues_atとdelete_ifのどちらを使うか迷いますね。迷ったときは、元の配列の形を変えて良いか?で判断しましょう。delete_ifは元の配列を変えてしまう、いわゆる破壊メソッドです。元の配列をそのままで、別に配列を作りたい場合はvalues_atを使いましょう。
uniqで重複する要素を削除
配列に値を格納していくうちに、重複した値が入ったとしましょう。重複した要素は1つを残してあとは消す、つまり重複した要素をまとめることができたら便利ですよね。そんなときはuniqを使います。
array = [1,2,3,4,3,2,4,5,3,2] p array.uniq
[実行結果]
[1, 2, 3, 4, 5]
重複した要素がまとめられました。
配列の中に配列(多重配列)
多重配列(二重配列)の基本
配列の中に配列を入れることができます。いわゆる、二重配列です。
例えば、こんな感じです。
array = [ [0,1,2], [3,4,5], [6,7,8] ] p array
[実行結果]
[[0, 1, 2], [3, 4, 5], [6, 7, 8]]
配列の中に配列を入れて、二次元配列ができました。アクセスするのも、普通の配列とあまり変わりません。2つめの配列の、2つ目の要素にアクセスします。
array = [ [0,1,2], [3,4,5], [6,7,8] ] p array[1][1]
[実行結果]
4
要素の番号は0から始まりますので、[1][1]で2つめの配列の2つ目の要素へのアクセスができます。
配列の平坦化 flatten
配列の中に配列が入っている状態で、個々の配列をすべてまとめて1つの配列にすることを平坦化といいます。flattenを使って1つの配列に展開することができます。
先ほどのサンプルをもう一度使い、解説します。
array = [ [0,1,2], [3,4,5], [6,7,8] ] p array.flatten
[実行結果]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
すべて1つの配列に展開できました。flattenには、flatten!という破壊メソッドもあります。用途に応じて使い分けてください。
その他Rubyの配列の面白いメソッド
Rubyの配列に関する面白いメソッドをまとめてみました。Rubyの不思議な世界をごらんください。
配列を繰り返す
配列*整数で、配列を整数回数分繰り返すことができます。
array = [1,2,3,4,5] array1 = array * 3 p array1
[実行結果]
arrayが3回繰り返された配列ができました。
配列を比較した結果を論理値で受け取る
eql?は、配列の全要素が同じかどうかを判断し、結果を論理値で受け取ることができます。
array1 = [1,2,3,4,5] array2 = [1,2,3,4,5] if array1.eql?(array2) do print “配列array1とarray2は全く同じです” end
[実行結果]
配列array1とarray2は全く同じです
2つの配列array1とarray2を比較した結果を、if文の条件式にそのまま入れることができるので便利です。
指定した内容を含むかどうか調べる
配列の中に、指定した内容を含むかどうかを調べるには、includeを使います。
array = ["a", "b", "f", "d", "e"] p array.include?("a")
[実行結果]
true
配列の要素にaという文字列が含まれるかどうかを調べて、trueを得ることができました。
配列をランダムに並び替える
配列の要素をランダムに並び替えるには、shuffleを使います。randomの使い方として、単に並び替えるだけでは面白くないので、例えば1,2,3,4,5という5つの数値をランダムに組み合わせて1つの数値を作る、という場合を考えましょう。
array = [1,2,3,4,5] puts array.shuffle.join
[実行結果]
45213
1,2,3,4,5をランダムに並び替えたあと、shuffleで連結することにより1つの文字列に変換することができました。もちろん、実行するたびに結果は異なります。
配列に配列を結合する
2つの配列を結合したいということは多くあります。そんなときは、concatを使います。配列の作り方も工夫しましょう。要素に空白を含まない場合、%w(文字列)で配列を生成できます。
array1 = %w(a b c d e) array2 = %w(f g h i j) p array1.concat(array2)
[実行結果]
["a", "b", "c", "d", "e", "f", "g", "h", "i", "j”]
2つの配列を結合できました。
まとめ
本記事では、配列の応用的な使い方を解説しました。配列にまつわる技術はこれでもほんの一部で、実はRubyにはもっとたくさんのメソッドがあります。
興味を持たれた方は、ぜひ探求してみてください。