ルビーで配列を扱う方法

はじめに

配列は要素と呼ばれる値のリストを表すデータ構造です。配列を使用することで、複数の値を1つの変数に格納することができます。Rubyでは、配列は数値、文字列、および他のRubyオブジェクトなど、任意のデータ型を含むことができます。これにより、コードを縮小し整理することができ、読みやすく保守しやすいものにすることができます。すべての配列は独自のメソッドを持つオブジェクトですので、データセットとの作業には統一された方法を提供します。

このチュートリアルでは、配列を作成し、それらが保持する値にアクセスし、配列内の要素を追加、変更、削除し、さらに複雑な問題を解決するために要素を反復処理する方法を学びます。

配列を作成する

最初に、より詳細に配列を作成する方法を見ていきます。例として、さまざまなサメの種類のリストがあります。配列がない場合、それらを個別の変数に格納するかもしれません。

シャークズ.rb
shark1 = "Hammerhead"
shark2 = "Great White"
shark3 = "Tiger"

この手法は冗長であり、柔軟性に欠けるため、メンテナンスが困難になる可能性が高いです。もし別のシャークを追加する場合、追加の変数を追加して追跡する必要があります。

配列を使用すれば、このデータを簡単にすることができます。Rubyプログラムで配列を作成するには、角括弧([])を使用し、格納したい値をコンマで区切ります。

上記のコードは、sharks.rbです。
sharks = ["Hammerhead", "Great White", "Tiger"]

3つの別々の変数を作る代わりに、今では3つのサメを含む1つの変数があります。この例では、角かっこ([])を使用して配列を作成し、各エントリをコンマで区切りました。もしもう1匹サメを追加しなければならない場合、新しい変数を作成して管理する代わりに、配列に別のサメを追加します。

print文で配列全体を出力することができます。この方法では、配列の内容が表示されます。

print sharks
Output

[“Hammerhead”, “Great White”, “Tiger”]

各エントリが単語である配列を作成したい場合は、単語配列を作成するための%w{}構文を使用することができます。

days = %w{Monday Tuesday Wednesday Thursday Friday Saturday Sunday}

これは、角かっこを使って配列を作成することと同等です。

days =  ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]

しかし、%w{}メソッドを使うと、引用符とカンマを省略することができることに注意してください。

配列は、類似したデータ型のリストをグループ化するためによく使用されますが、Rubyでは、配列は任意の値または複数の値を含むことができます。これには他の配列も含まれます。以下に、文字列、nil値、整数、および文字列の配列を含む配列の例を示します。

混合データ.rb
record = [
    "Sammy",
    null,
    7,
    [
        "another",
        "array",
    ]
]

今後、配列に格納されたデータにアクセスする方法を確認します。

配列中の項目へのアクセス

特定のアイテムまたは配列の要素にアクセスするためには、そのインデックスまたは配列の位置を参照します。Rubyでは、インデックスはゼロから始まります。sharks配列から最初の要素を取得するためには、要素のインデックスを変数に角カッコで追加します。

「sharks.rb」というファイル
sharks = ["Hammerhead", "Great White", "Tiger"]

「sharks」の配列には3つの要素があります。以下に、sharks配列の各要素がどのようにインデックスされているかを詳しく説明します。

Hammerhead Great White Tiger
0 1 2

配列の最初の要素はハンマーヘッドで、インデックスは0です。最後の要素はタイガーで、インデックスは2です。インデックスでは0から数え始めるため、1から数えるのが自然な直感とは反対です。そのため、自然になるまでこれを意識しておく必要があります。

Note

注意:インデックスをオフセットと考えると、配列の先頭からの場所の数として役立つかもしれません。最初の要素は先頭にあるため、オフセットまたはインデックスは0です。2番目の要素は、配列の最初のエントリから1つ離れた場所にあるため、オフセットまたはインデックスは1です。

配列の要素数は、lengthメソッドを使って調べることができます。

sharks.length
Output

3

ネズミザメのインデックスは0から2まで始まりますが、長さプロパティは配列内の要素の数、つまり3を返します。インデックスは全く関係ありません。

もし、配列内の特定の要素(例:Tiger)のインデックス番号を知りたい場合は、index() メソッドを使用してください。

print sharks.index("Tiger")
Output

2

これは、そのテキストを含んだ最初の要素のインデックスを返します。存在しない値の場合、インデックス番号が見つからない場合は、コンソールはnilを返します。

print sharks.index("Whale")
Output

nil

Rubyの配列の最後の要素を取得するには、インデクス-1を使用します。

print sharks[-1]
Output

“Tiger”

Rubyでは、最初の要素と最後の要素をインデックスを使用せずに取得するためのfirstメソッドとlastメソッドも提供しています。

puts sharks.first
puts sharks.last
Output

“Hammerhead” “Tiger”

存在しないインデックスにアクセスしようとすると、nilが返されます。

sharks[10]
Output

nil

配列は他の配列を含むことができ、これをネストされた配列と呼びます。これはプログラム内の二次元データセットをモデル化する方法の一つです。以下はネストされた配列の例です。

nested_array = [
    [
        "salmon",
        "halibut",
    ],
    [
        "coral",
        "reef",
    ]
]

ネストされた配列の要素にアクセスするためには、内側の配列に対応する別のインデックス番号を追加します。例えば、このネストされた配列からcoralという値を取得するためには、次の文を使用します。

print nested_array[1][0];
Output

coral

この例では、nested_array変数の1番目の位置の配列にアクセスしました。その結果、配列[“coral”, “reef”]が返されました。次に、その配列の0番目の位置にある要素にアクセスしましたが、それは”coral”でした。

今度は、配列に要素を追加する方法について見ていきます。

配列に要素を追加する。

「あなたのsharks配列には、0から2のインデックスに3つの要素があります」

サメ.rb
sharks = ["Hammerhead", "Great White", "Tiger"]

新しい要素を追加する方法はいくつかあります。次のインデックス(この場合は3)に値を割り当てることができます。

sharks[3] = "Whale";

print sharks
Output

[“Hammerhead”, “Great White”, “Tiger”, “Whale”]

この方法は誤りを犯しやすいです。要素を追加する際にインデックスを間違えて飛ばしてしまうと、配列にはnilの要素が作成されます。

sharks[5] = "Sand";

print sharks;
Output

[“Hammerhead”, “Great White”, “Tiger”, “Whale”, nil, “Sand”]

追加の配列要素にアクセスしようとすると、その値が返され、値は nil になります。

sharks[4]
Output

nil

配列内で次に利用可能なインデックスを見つけることは、誤りを起こしやすく追加の時間がかかります。誤りを避けるためには、pushメソッドを使って要素を配列の末尾に追加してください。

sharks.push("Thresher")
print sharks
Output

[“Hammerhead”, “Great White”, “Tiger”, “Whale”, nil, “Whale”, “Thresher”]

配列の末尾に要素を追加するために、プッシュメソッドの代わりに「<<」構文を使用することもできます。

sharks << "Bullhead"
Output

[“Hammerhead”, “Great White”, “Tiger”, “Whale”, nil, “Whale”, “Thresher”, “Bullhead”]

配列の先頭に要素を追加するには、unshift()メソッドを使用してください。

sharks.unshift("Angel")
print sharks
Output

[“Angel”, “Hammerhead”, “Great White”, “Tiger”, “Whale”, nil, “Whale”, “Thresher”, “Bullhead”]

要素の追加方法がわかったので、今度は要素の削除方法を見ていきましょう。

配列から要素を削除する

特定の要素を配列から削除するには、deleteまたはdelete_atメソッドを使用します。sharks配列で、以前にnilの配列要素を作成しました。今はそれを取り除きます。

最初に、配列内の位置を見つけます。そのために、indexメソッドを使用することができます。

print sharks.index(nil)
Output

4

その後、delete_atを使用してインデックス4の要素を削除し、配列を出力してください。

sharks.delete_at(4)
print sharks
Output

[“Angel”, “Hammerhead”, “Great White”, “Tiger”, “Whale”, “Thresher”, “Bullhead”]

指定した値と一致する要素を配列から削除する削除メソッドを使用してください。配列からWhaleを削除するために使ってください。

sharks.delete("Whale")
print sharks;
Output

[“Angel”, “Hammerhead”, “Great White”, “Tiger”, “Thresher”, “Bullhead”]

与えた値のすべての出現箇所を削除するため、deleteメソッドは配列内の重複要素もすべて削除します。

pop()メソッドは配列の最後の要素を削除します。

sharks.pop
print sharks;
Output

[“Angel”, “Hammerhead”, “Great White”, “Tiger”, “Thresher”]

配列の最後の要素としてのBullheadが削除されました。配列の最初の要素を削除するためには、shiftメソッドを使用してください。

sharks.shift
print sharks
Output

[“Hammerhead”, “Great White”, “Tiger”, “Thresher”]

今回、エンジェルは配列の最初から削除されました。

配列の先頭および末尾から要素を削除するには、popとshiftを使用することができます。できるだけpopを使用することが推奨されています。なぜなら、配列の残りの要素は元のインデックス番号を保持するからです。

delete_at、pop、shiftのメソッドはすべて元の配列を変更し、削除した要素を返します。

シャークス.rb
sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
deleted_at_element = sharks.delete_at(1)
popped_element = sharks.pop

puts "Deleted_at element: #{deleted_at_element}"
puts "Popped element: #{popped_element}"

puts "Remaining array: #{sharks}"
Output

Deleted_at element: Great White Popped element: Whale Remaining array: [“Hammerhead”, “Tiger”]

あなたは今、配列から要素を削除するいくつかの方法を知っています。今度は、既に持っている要素をどのように変更するかを見ていきましょう。

配列内の既存の要素の修正

配列の要素を更新するには、通常の変数と同じように代入演算子を使用して、要素のインデックスに新しい値を代入します。

新しいサメの配列が与えられた場合、インデックス0の「ハンマーヘッド」を「エンジェル」に置き換えます。

sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
sharks[0] = "Angel"
print sharks;
Output

[“Angel”, “Great White”, “Tiger”, “Whale”]

要素を正しく更新するために、削除したい要素を見つけるために使用したように、最初にインデックスメソッドを使用してその要素を特定することができます。

今から、配列の要素すべてとどのように作業するかを見ていきます。

配列を繰り返し処理する

Rubyには配列を反復処理するための多くの方法がありますが、使用するメソッドは行いたい作業の種類によって異なります。次に、配列を反復処理して各要素を表示する方法を探っていきます。

Rubyでは、for..in構文が提供されています。

sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
for shark in sharks do
  puts shark
end

sharks配列の各要素に対して、Rubyはその要素をローカル変数sharkに割り当てます。その後、putsを使用して要素の値を出力できます。

たとえば、for..in をあまり頻繁には見ません。Rubyの配列はオブジェクトであり、要素を取り扱うために each メソッドを提供します。each メソッドは、for..in と似たような動作をしますが、異なる構文を持っています。

各々.rb
sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
sharks.each do |shark|
  puts shark
end

eachメソッドは、Rubyプログラミングでよく見かける構文を使用します。それはRubyのブロックを引数として取ります。ブロックとは、そのメソッドのコンテキストで後で実行されるいくつかのコードです。この場合、コードはputs sharkです。パイプ文字(|)で囲まれたsharkキーワードは、ブロックがアクセスする配列内の要素を表すローカル変数です。Rubyはこの変数に要素を割り当て、ブロック内のコードを実行します。eachメソッドは、配列内の各要素に対してこのプロセスを繰り返します。

Output

Hammerhead Great White Tiger Whale

ブロックが単一行の場合、Rubyの開発者はしばしばdoとendキーワードを中括弧で置き換え、文全体を1行に縮めます。

各.rb
...
sharks.each {|shark| puts shark }

これは同じ結果を出すが、コードの行数が少なくなるように作られています。

以下のように日本語で述べ直してみました:

each_with_indexメソッドは似たような方法で動作しますが、配列要素のインデックスにもアクセスできます。このプログラムはeach_with_indexを使用して、各要素のインデックスと値を出力します。

それぞれの要素とインデックスを示すeach_with_index.rb
sharks = ["Hammerhead", "Great White", "Tiger", "Whale"]
sharks.each_with_index do |shark, index|
  puts "The index is #{index}"
  puts "The value is #{shark}"
end

配列の各要素に対して、Rubyは要素を変数sharkに代入し、現在のインデックスをindex変数に代入します。その後、ブロック内でこれらの変数の両方を参照することができます。

Output

The index is 0 The value is Hammerhead The index is 1 The value is Great White The index is 2 The value is Tiger The index is 3 The value is Whale

自分のプログラムでは、データベースの項目をウェブサイトに表示する必要がある場合や、ファイルから行を読み込んでその内容を処理する場合など、頻繁に配列の要素を繰り返し処理することがあります。

結論

配列は、Rubyでプログラミングの非常に多機能で基本的な部分です。このチュートリアルでは、配列を作成し、個々の要素にアクセスしました。また、配列内の要素を追加、削除、修正しました。最後に、配列を反復処理し、その内容を表示する2つの方法を探索しました。これはデータを表示する一般的な方法として使用されます。

Rubyのデータ型について学ぶには、「Understanding Data Types in Ruby」というチュートリアルを読んでください。

コメントを残す 0

Your email address will not be published. Required fields are marked *