Rubyの配列で要素を追加するにはどうすればいいの?
Rubyの配列で各要素を取得する方法を知りたい
こんにちは。フリーランスのWebコーダー・プログラマーとして主にPHP/WordPress/BuddyPress/VPSサーバー構築などの業務に携わっている貝原です。
今日は、Rubyの配列の基本文法について解説したいと思います。Rubyの配列と一言で言っても実はできることはたくさんあります。
そこで、この記事ではRubyの配列について使い方の基礎の基礎から、配列でよく使うメソッドまで網羅的に解説していきます。
この記事では、以下の内容で解説していきます。
- 配列の基本形(リテラル)
- 配列の6つの基本
- 配列のpush、pop、shift、unshiftメソッド
- 配列のsort、sort_byメソッド
- 配列のeachメソッド
このページで、Rubyの配列の使い方をよく把握して自分のスキルとしていきましょう!
Rubyの配列の基本形(リテラル)
配列とは、Rubyの任意のオブジェクトを複数まとめて同じように取り扱うためのオブジェクトです。配列のリテラル表現は、[]で囲み、カンマ「,」区切りで記述します。
配列のリテラル表現とは、Rubyのコード中で配列とその内容を定義するためのコードによる配列の表現です。配列には、任意のRubyオブジェクトを要素としてもつことが可能です。
配列の中にハッシュを入れることや、配列の中にさらに配列を入れる入れ子の配列を作ることもできます。
# 文字列の配列 ["Samurai", "Ruby", "Rails", "Python"] # 数値の配列 [50, -60, 700, 8000] # ハッシュの配列 [{ruby: 80}, {python: 70}, {swift: 60}] #配列の入れ子 ["Samurai", ["Ruby", "Rails"], "Python"] # オブジェクトが混在した配列 [50, "Samurai", ["Ruby", "Rails"], "Python", {ruby: 80}, 8000]
以上のように、配列の要素には任意のオブジェクトを入れることができます。
任意のオブジェクトを入れることができるということは、数値やハッシュ、配列などを配列に入れることも可能だということです。配列の基礎については、下記の記事を参照してください。
Rubyの配列の6つの基本
初期化
配列の初期化は、空の配列のリテラル表現[]を代入することで可能です。また、Arrayクラスのnewメソッドにより配列を初期化することもできます。
初期化後の配列は通常、空の配列です。newメソッドに配列のサイズを指定して任意の要素数の配列を初期化できます。
また。newメソッドに配列のサイズと要素の初期値を指定して任意の要素数で同じ初期値を持った要素を持つ配列を初期化することもできます。
#初期化 array = [] puts "No.1:" + array.to_s #または array = Array.new() puts "No.2:" + array.to_s #サイズを指定して初期化 array = Array.new(3) puts "No.3:" + array.to_s #サイズと要素を指定して初期化 array = Array.new(3, "samurai") puts "No.4:" + array.to_s
実行結果:
No.1:[] No.2:[] No.3:[nil, nil, nil] No.4:["samurai", "samurai", "samurai"]
以上のように、空の配列として初期化できました。また、要素数や初期値を指定して配列を初期化できました。
なお、配列の初期化について、詳しくは下記の記事を参照してください。
要素の取得
配列の要素を取得するには、配列の入った変数に対して[]演算子にインデックス(添え字)を指定します。
例えば、array変数のインデックス0番目の要素を取得するには、以下のようなコードを書きます。
array[0]
実際にサンプルコードで確認してみましょう。
array = ["Samurai", "Ruby", "Rails", "Python"] # インデックスを指定して値を取得 puts "No.1:" + array[0].to_s puts "No.2:" + array[1].to_s puts "No.3:" + array[2].to_s puts "No.4:" + array[3].to_s
実行結果:
No.1:Samurai No.2:Ruby No.3:Rails No.4:Python
以上のように、配列に対し[]演算子を使ってインデックスを指定することで、配列の要素を取得できました。
要素の追加
配列に要素を追加するには、配列の入った変数に[]演算子で存在しないインデックスを指定し、それに対し値を代入します。存在しなかったインデックスに対し、要素が追加されます。
また、簡単に配列に要素を追加する方法として、配列のpushメソッドがあります。pushメソッドは、配列の末尾に指定した値を追加します。
実際にサンプルコードをみてみましょう。
array = ["Samurai", "Ruby", "Rails", "Python"] # 存在しないインデックスを指定 puts "No.1:" + array[4].to_s # 代入 array[4] = "Java" # 代入の結果を表示 puts "No.2:" + array[4].to_s # 配列全体を表示 puts "No.3:" + array.to_s # pushメソッドでも追加できる array.push("PHP") puts "No.4:" + array.to_s
実行結果:
No.1: No.2:Java No.3:["Samurai", "Ruby", "Rails", "Python", "Java"] No.4:["Samurai", "Ruby", "Rails", "Python", "Java", "PHP"]
以上のように、配列の入った変数に[]演算子で存在しないインデックスを指定し、それに対し値を代入することで、配列の要素を追加できます。また、配列のpushメソッドにより、配列の末尾に要素を追加できます。
要素の更新
配列の要素を更新するには、配列の入った変数に[]演算子で既存のインデックスを指定し、それに対し値を代入します。例えば、array変数のインデックス1番目の要素を更新するには、以下のようなコードを書きます。
array[1] = 値
実際のサンプルコードをみていきましょう。
array = ["Samurai", "Ruby", "Rails", "Python"] # 1番目の要素は"Samurai" puts "No.1:" + array[1].to_s # 1番目の要素を更新 array[1] = "Swift" puts "No.2:" + array[1].to_s # 配列全体を表示 array puts "No.3:" + array.to_s
実行結果:
No.1:Ruby No.2:Swift No.3:["Samurai", "Swift", "Rails", "Python"]
以上のように、配列の入った変数に[]演算子で既存のインデックスを指定し、それに対し値を代入することで、配列の要素を更新できます。
要素の削除
配列の要素を削除するには、配列のdeleteメソッドを使用します。deleteメソッドに値を指定すると、配列中の同じ値をもつ要素を削除します。
また、配列に[]演算子でインデックスの範囲を指定し、それに空の配列リテラル[]を代入することで、指定したインデックスの範囲分だけ配列から要素を削除できます。
実際のサンプルコードをみていきましょう。
array = ["Samurai", "Ruby", "Rails", "Python", "Ruby"] puts "No.1:" + array.to_s # 同じ要素を全て削除 array.delete("Ruby") puts "No.2:" + array.to_s #範囲を指定して削除できる array = ["Samurai", "Ruby", "Rails", "Python"] # インデックスの1から2個の要素を削除 array[1, 2] = [] puts "No.3:" + array.to_s
実行結果:
No.1:["Samurai", "Ruby", "Rails", "Python", "Ruby"] No.2:["Samurai", "Rails", "Python"] No.3:["Samurai", "Python"]
以上のように、deleteメソッドに値を指定して配列中の同じ値を持つ要素を削除できます。また、配列にインデックスの範囲を指定し、空の配列リテラル[]を代入することで配列のインデックスの範囲を削除できます。
要素数の取得
配列の要素数を取得するには、sizeメソッドを実行します。また、sizeメソッドのエイリアスであるlengthメソッドでも、配列の要素数を取得できます。
さらにcountメソッドでも配列の要素数を取得できます。countメソッドの引数に値を指定すると、配列中で同じ値を持つ要素数を取得できます。
実際のサンプルコードをみていきましょう。
# sizeメソッド、lengthメソッド、countメソッドを使用する array = ["Samurai", "Ruby", "Rails", "Python", "Ruby"] # sizeメソッド puts "No.1:" + array.size.to_s # lengthメソッド puts "No.2:" + array.length.to_s # countメソッド puts "No.3:" + array.count.to_s # countメソッドは指定した値が配列に何個あるか数える puts "No.4:" + array.count("Ruby").to_s
実行結果:
No.1:5 No.2:5 No.3:5 No.4:2
以上のように、配列のsize、length、countメソッドで配列の要素数を取得できます。また、countメソッドの引数に値を指定することで、配列中の同じ値をもつ要素数を取得できます。
なお、配列のsize、length、countメソッドについて、詳しくは下記の記事を参照してください。
Rubyの配列のよく使うメソッド
以降は、配列でよく使うメソッドを紹介していきます。なお、配列でよく使うメソッドについて、詳しくは下記の記事を参照してください。
配列のpush、pop、shift、unshiftメソッド
配列の末尾に要素を1つ追加するにはpushメソッドを使用します。対して配列の末尾から要素を1つ削除するにはpopメソッドを使用します。
配列の先頭に要素を1つ追加するにはunshiftメソッドを使用します。対して配列の先頭から要素を1つ削除するにはshiftメソッドを使用します。
実際のサンプルコードをみていきましょう。
array = ["Samurai", "Ruby", "Rails"] # pushは要素の配列の末尾への追加 array.push("Swift") puts "No.1:" + array.to_s # popは要素の配列の末尾からの削除 array.pop puts "No.2:" + array.to_s # unshiftは要素の配列の先頭への追加 array.unshift("Scala") puts "No.3:" + array.to_s # shiftは要素の配列の先頭からの削除 array.shift puts "No.4:" + array.to_s
実行結果:
No.1:["Samurai", "Ruby", "Rails", "Swift"] No.2:["Samurai", "Ruby", "Rails"] No.3:["Scala", "Samurai", "Ruby", "Rails"] No.4:["Samurai", "Ruby", "Rails"]
以上のように、配列の末尾の要素を追加・削除するには、push、popメソッドを使用します。配列の先頭の要素を追加・削除するには、unshift、shiftメソッドを使用します。
配列のsort、sort_byメソッド
配列の要素を、値の昇順に並び替えるにはsortメソッドを使用します。配列の要素を、好きな順番で並び替えるにはsortメソッドにブロックを与えます。
ブロックのブロック変数に配列を並び替えるために比較する2要素が与えられます。この2要素の比較基準を変えることで、好きな順番でsortできます。ここでは、sortの並び替えの具体的な例として、配列の要素を降順に並び替えるコードを紹介します。
array.sort {|a, b| b <=> a }
上記コードで、ブロックの返り値は「b <=> a 」です。「b <=> a 」は、bがaより大きいときに1を返し、bがaより小さいときに-1を返します。bとaが等しいときは0を返します。
この返値により、sortメソッド中でbが大きいときにbをそのままの順番に置いたままにし、bが小さいときにbとaの順番を入れ替えます。bとaが等しいときには何もしません。このsortの挙動により、結果的に配列が降順に並び替えられます。
この例はsortの一例ですが、例えば「a <=> b」とした場合は、配列が昇順に並び替えられます。
実際のサンプルコードをみていきましょう。
# 単にsortメソッドを呼び出せば昇順ソートが行われる array = [3, 2, 4, 8, 5, 10, 1, 9, 6, 7] puts "No.1:" + array.sort.to_s # ブロック変数にsort用の2要素を受け取れば、その比較結果をsortの基準にする # ここでは、b <=> a により、降順sortになる array = ["Samurai", "Ruby", "Rails", "Swift", "Java", "PHP"] puts "No.2:" + (array.sort {|a, b| b <=> a }).to_s
実行結果:
No.1:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] No.2:["Swift", "Samurai", "Ruby", "Rails", "PHP", "Java"]
以上のように、sortメソッドにより昇順に配列が並び替えられます。
また、sortメソッドにブロックを渡すことにより、好きな順番で配列を並び替えることができます。別の方法で配列を好きな順番で並び替える方法として、sort_byがあります。
sort_byでは並び替える要素をブロック引数として受け取ります。そのブロックの返値で、並び替える基準となる値を指定することで、その基準で並び替えられます。
以下のサンプルコードでは、文字列の長さを基準にして昇順で並び替えています。
array = ["Samurai", "Ruby", "Rails", "PHP"] # sort_by のブロックの返値がsort基準になる # ここでは文字列の長さをsort基準にしている puts "No.1:" + (array.sort_by {|a| a.size }).to_s
実行結果:
No.1:["PHP", "Ruby", "Rails", "Samurai"]
以上のように、sort_byのブロック引数aに対し、a.sizeと文字列長をブロックの返値に指定することで、配列の並び替えの基準を文字列長の昇順にしています。
配列のeachメソッド
配列の要素を1つ1つずつループさせて、各ループでブロックを実行させる方法としてeachメソッドがあります。eachメソッドは配列の要素数分、繰り返し実行されます。
その際、eachメソッドのブロックのブロック変数に、配列の1つの要素が与えられます。この機能を使って、配列の要素を1つ1つputsメソッドで出力した例が、以下のサンプルコードです。
array = ["Samurai", "Ruby", "Rails", "Swift", "Java", "PHP"] cnt = 1 array.each {|item| puts "No.#{cnt}:" + item.to_s cnt += 1 }
実行結果:
No.1:Samurai No.2:Ruby No.3:Rails No.4:Swift No.5:Java No.6:PHP
以上のように、eachメソッドにより配列の要素が1つ1つブロックのブロック引数に与えられ、ブロックが各要素分だけ実行されます。そのブロックのコードは自由に記述が可能で、配列の要素ごとに実行するコードをカスタマイズできます。
まとめ
今回は、Rubyの配列の基本文法について学習しました!
学習のポイントを振り返ってみましょう!
- 配列はリテラル表現とオブジェクト表現がある
- 配列はリテラルやArray.newメソッドで初期化できる
- 配列の要素は取得・追加・更新・削除できる
- 配列の要素の追加・削除はpush、pop、unshift、shiftメソッドで実行できる
- 配列の要素はsort、sort_byメソッドで並び替えできる
- 配列の要素を1つ1つ数え上げてブロックを実行できる
以上の内容を再確認し、ぜひ自分のプログラムに生かし学習を進めてください!