Rubyで配列を操作する方法

導入

配列は値のリストを表すデータ構造で、要素と呼ばれる値の集まりを表します。配列を使用すると、複数の値を1つの変数に格納できます。Rubyでは、配列は数値、文字列、および他のRubyオブジェクトを含む任意のデータ型を格納できます。これにより、コードを簡素化し、整理して、可読性と保守性を向上させることができます。すべての配列は、それぞれのメソッドを呼び出すことができるオブジェクトであり、データセットとの作業を標準化します。

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

配列の作成

まず、配列の作成方法について詳しく見ていきます。例として、さまざまなサメの種のリストがあります。配列を使用しない場合、それらを個々の変数に格納するかもしれません:

sharks.rb
shark1 = "Hammerhead"
shark2 = "Great White"
shark3 = "Tiger"

このアプローチは冗長であり、柔軟性がないため、すぐに保守が難しくなります。別のサメを追加すると、追加の変数を追加し、追跡する必要があります。

配列を使用すると、これを簡素化できます。Rubyプログラムで配列を作成するには、角かっこ([])を使用し、格納したい値をコンマで区切ります。

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

代わりに3つの別々の変数を作成する代わりに、これで3匹のサメを含む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値、整数、および文字列の配列を含む配列の例です:

mixed_data.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

配列の最初の要素は Hammerhead で、インデックスは 0 です。最後の要素は Tiger で、インデックスは 2 です。インデックスは 0 から数え始めるため、1から数え始めるという直感とは異なるので、自然になるまで注意が必要です。

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

配列内の要素の数を length メソッドで取得できます:

sharks.length
Output
3

sharks のインデックスは 0 から 2 までですが、length プロパティは配列内の要素の数、つまり 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

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

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つの要素があります。

sharks.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"]

pushメソッドの代わりに<<構文を使用して要素を配列の末尾に追加することもできます:

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"]

`delete`メソッドは、渡した値に一致する配列からの要素を削除します。配列から`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"]

この時、`Angel`が配列の始めから削除されました。

`pop`と`shift`を使用することで、配列の始めと終わりから要素を削除できます。可能な限り`pop`を使用することが好まれます、なぜなら配列の残りの項目は元のインデックス番号を保持するからです。

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

sharks.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"]

これで、配列から要素を削除するいくつかの方法を知りました。次に、既に持っている要素をどのように変更するかを見ていきます。

配列の既存の要素を変更する

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

新しいサメの配列があり、インデックス"Hammerhead""Angel"を置き換えます:

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

正しい要素を更新するために、まず要素を見つけるために使用したように、indexメソッドを使用できます。

次に、配列内のすべての要素を操作する方法を見てみます。

配列を反復処理する

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と似たような方法で機能しますが、異なる構文を持っています。

each.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開発者はdoendキーワードを波括弧に置き換え、ステートメント全体を1行に圧縮することがよくあります:

each.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のデータ型については、チュートリアルRubyのデータ型の理解を読んで学んでください。

Source:
https://www.digitalocean.com/community/tutorials/how-to-work-with-arrays-in-ruby