Rubyも他言語と同様に配列を扱うことができます。突然ですが、2つの配列array1とarray2を使った以下の条件式、何をしているか分かりますか?
p array1 <=> array2
見慣れない<=>というのも気になるし、文全体で何をしているか見えてこないですよね。でも、これはRubyの中ではごく普通の記述なんです。
本記事では、Rubyにおける配列の基本を解説します。さらに応用として、
・配列の要素を削除
・配列の要素を追加
・配列の比較
・配列の連結やマージ
といった、実際の開発でよく使う配列の操作を解説します。ひととおり読むと、先の不思議な式が何をしているのか分かるだけでなく、配列の基本知識を得ることができますよ!
[linkPotefuri word=フリーランス案件をお探しの方はこちら ]
配列の基本
配列の作り方
変数名のあとに、[ ]で要素を並べるだけで配列ができます。配列を表示するときは、pメソッドを使います。
numbers = [0, 1, 2, 3, 4, 5] strings = ["a", "b", "c", "d" ] p numbers p strings
[実行結果]
[0, 1, 2, 3, 4, 5] ["a", "b", "c", "d"]
それぞれ、初期値を与えつつ配列を作ることができました。また「a = []」と要素がない配列を宣言し、「a[0] = 0」として要素を入れていくことも可能です。
ここでちょっと意地悪しましょう。上記の配列numbersの11番目、つまり間を飛ばして値を入れるとどうなるでしょうか?
numbers = [0, 1, 2, 3, 4, 5] numbers[10] = 6 p numbers
[実行結果]
[0, 1, 2, 3, 4, 5, nil, nil, nil, nil, 6]
エラーとはならず、6〜9番目を飛ばして(つまり間はnil)10番目に値6を入れることができました。このように、Rubyの配列では、間を詰める必要はありません。これは大きな特徴ですよね。
配列の生成は、Arrayクラスのnewメソッドを使う方法もあります。
array = Array.new(3,100) p array
[実行結果]
[100, 100, 100]
100という要素を3つ持つ配列ができました。
何らかの区切り文字(カンマや空白)で区切られた文字列から配列を作れます。
array = "あああ, いいい, ううう, えええ, おおお".split(",") p array
[実行結果]
["あああ", " いいい", " ううう", " えええ", " おおお"]
1つの文字列から配列ができました。
配列の要素を指定する
番号を指定して要素を取り出します。2つ目を取り出すには、以下のようにします。
array = ["a", "b", "c", "d"] puts array[2]
[実行結果]
c
マイナスを使うと、後ろから何番目か、という指定ができます。-1が一番最後、-2, -3 … と増えていくたびに前にいきます。
array = ["a", "b", "c", "d"] puts array[-2]
[実行結果]
c
後ろから2つめが表示されました。
配列を部分的に取り出し、別の配列にすることもできます。例えば、2〜4つ目を取り出してみましょう。
array = ["a", "b", "c", "d"] p array[1..3]
[実行結果]
["b", "c", "d"]
2つ目から4つ目の要素で、新たに配列ができたのがわかります。
配列の要素を削除する
要素を削除するには、delete(要素の中身)を使います。
array = ["a", "b", "c", "d"] array.delete("c") p array
[実行結果]
["a", "b", "d"]
cと一致する3番目の要素が消えました。
要素番号を指定する場合は「array.delete_at(2)」と書き換えればOKです。
その他便利なメソッドとして、compact! をご紹介します。compact! は、配列からnilの要素だけを消してしまうことができます。
numbers = [0, 1, 2, 3, 4, 5] numbers[9] = 7 p numbers numbers.compact! p numbers
[実行結果]
[0, 1, 2, 3, 4, 5, nil, nil, nil, 7] [0, 1, 2, 3, 4, 5, 7]
nilの要素が消えました。とりあえず配列に値をまばらに入れておき、最後にnilだけ一気に消してしまうことができるので、とても便利です。
[linkPoteCan word=3ヶ月間のRuby実践研修プログラムはこちら ]
配列の要素を追加する
配列の先頭に要素を追加するときは、unshift()を使います。
array = ["a", "b", "c", "d"] array.unshift("m") p array
[実行結果]
["m", "a", "b", "c", "d"]
末尾に追加するときは、push()を使います
array = ["a", "b", "c", "d"] array.push("m") p array
[実行結果]
["a", "b", "c", "d", "m"]
配列を比較する
2つの配列の要素がすべて等しいかどうかを判定するには==を使います。以下の実行結果は、要素は全て等しいのでtrueと表示されます
array1 = ["a", "b", "c", "d", "e"] array2 = ["a", "b", "c", "d", "e"] p array1 == array2
比較と同時に、どちらが大きかったのか、つまりどちらの要素が多かったのかも知りたい場合は、<=>を使います。
array1 = ["a", "b", "c", "d", "e"] array2 = ["a", "b", "c", "d"] p array1 <=> array2
[実行結果]
1
<=>演算子は、先頭から順に2つの配列を比較し、すべて等しいまま最後まで達すると0、array1の方が短ければ-1を、そうでなければ1を返します。どちらかが異なっていれば-1を返します。
[linkPoteCan word=Rubyへのスキルチェンジを目指すなら! ]
配列を結合する
2つの配列を結合するには、|か+を使います。|は同じ要素が含まれていれば集約し、+は重複に関係なく結合します。
array1 = ["a", "b", "c", "d", "e"] array2 = ["a", "b", "c", "d"] p array1 | array2 p array1 + array2
[実行結果]
["a", "b", "c", "d", "e"] ["a", "b", "c", "d", "e", "a", "b", "c", "d"]
違いがお分かりいただけたでしょうか?
配列は列?それとも集合体?
配列のもつさまざまな挙動を学習するとき、ぜひ覚えておいてほしいことがあります。配列は、列と集合体という2つの側面を持つ、ということをです。
連結するときは、 | を使うと和集合の意味になります。しかしpushを使うと、配列を列(つまりキュー)として扱うことになります。こういった列と集合の違いを押さえておいてください。
まとめ
この記事では、配列の基本や応用を解説しました。自分で何度も配列を作っては操作してみて、理解を深めてくださいね!