Rubyで配列を操作する方法

提供:Dev Guides
移動先:案内検索

序章

array は、elementsと呼ばれる値のリストを表すデータ構造です。 配列を使用すると、1つの変数に複数の値を格納できます。 これにより、コードが凝縮されて整理され、読みやすく、保守しやすくなります。 また、配列は独自のメソッドを持つオブジェクトであるため、データのリストの操作をはるかに簡単にすることができます。

Rubyで。 配列には、数値、文字列、その他のRubyオブジェクトを含む任意のデータ型を含めることができます。

配列がいかに強力であるかの簡単な例を見てみましょう。 電子メールアドレスのリストを維持する必要があると想像してください。 配列がない場合は、次のように電子メールアドレスを変数に格納できます。

emails.rb

email1 = "[email protected]"
email2 = "[email protected]"
email3 = "[email protected]"
email4 = "[email protected]"

このアプローチは冗長であり、柔軟性が低いため、すぐに保守が困難になる可能性があります。 別のメールアドレスを追加すると、追加の変数を追加して追跡する必要があります。

配列を使用する場合は、このデータを単純化できます。

emails.js

emails = [
  "[email protected]",
  "[email protected]",
  "[email protected]",
  "[email protected]"
]

5つの個別の変数を作成する代わりに、4つの電子メールアドレスすべてを含む1つの変数ができました。 この例では、角かっこ[]を使用して配列を作成し、各エントリをコンマで区切りました。 追加の電子メールアドレスを追加する必要がある場合は、新しい変数を作成して管理するのではなく、配列に別の電子メールアドレスを追加します。

特定のアイテム、または配列の要素にアクセスするには、そのインデックス、または配列内のその位置を参照します。 Rubyでは、インデックスはゼロから始まります。 したがって、emails配列から最初の要素を取得するには、次のように角かっこを使用して要素のインデックスを変数に追加します。

print emails[0];
[email protected]

このチュートリアルでは、配列を作成し、配列に含まれる値にアクセスし、配列内の要素を追加、変更、および削除し、配列内の要素を反復処理して、より複雑な問題を解決します。 まず、配列を作成する方法を詳しく見ていきましょう。

配列の作成

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

たとえば、サメの配列を作成し、次のように変数に割り当てます。

sharks.rb

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

printステートメントを使用して配列全体を印刷できます。これにより、配列の内容が表示されます。

print sharks
Output["Hammerhead", "Great White", "Tiger"] 

各エントリが1つの単語である配列を作成する場合は、%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",
    ]
]

次に、配列に格納されているデータにアクセスする方法を見てみましょう。

配列内のアイテムへのアクセス

角かっこで囲まれたアイテムのindexを参照して、Ruby配列のアイテムにアクセスします。

変数sharksに割り当てられたサメの配列を使用して、この概念を調べてみましょう。

sharks.rb

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

sharks配列には3つの要素があります。 sharks配列の各要素のインデックス作成方法の内訳は次のとおりです。

ハンマーヘッド グレートホワイト
0 1 2

配列の最初の要素はHammerheadで、0でインデックスが付けられます。 最後の要素はTigerで、2でインデックスが付けられます。 カウントはインデックスの0で始まります。これは、1からカウントを開始するという私たちの自然な直感に反するため、自然になるまでこれを覚えておく必要があります。

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


lengthメソッドを使用すると、配列に含まれる要素の数を確認できます。

sharks.length
Output3

sharksのインデックスは0で始まり、2に移動しますが、lengthプロパティは、配列内の要素の数である3。 インデックスには全く関係ありません。

seahorseなど、配列内の特定の要素のインデックス番号を確認する場合は、index()メソッドを使用します。

print sharks.index("Tiger")
Output2

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

print sharks.index("Whale")
Outputnil

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

print sharks[-1]
Output"Tiger"

Rubyには、インデックスを使用せずに最初と最後の要素を取得するためのfirstおよびlastメソッドも用意されています。

puts sharks.first
puts sharks.last
Output"Hammerhead"
"Tiger"

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

sharks[10]
Outputnil

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

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

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

print nested_array[1][0];
Outputcoral

この例では、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]
Outputnil

配列内で次に使用可能なインデックスを見つけることはエラーが発生しやすく、余分な時間がかかります。 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)
Output4

次に、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メソッドは、渡した値の all オカレンスを削除するため、配列に重複する要素がある場合、それらはすべて削除されます。

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がアレイの先頭から削除されました。

popshiftを使用すると、配列の最初と最後から要素を削除できます。 配列内の残りの項目は元のインデックス番号を保持するため、可能な限りpopを使用することをお勧めします。

delete_atpop、および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}"
OuptutDeleted_at element: Great White
Popped element: Whale
Remaining array: ["Hammerhead", "Tiger"]

これで、配列から要素を削除するいくつかの方法がわかりました。 次に、すでに持っている要素を変更する方法を見てみましょう。

既存の要素の変更

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

インデックス0"Hammerhead"がある新しいサメの配列が与えられたら、"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メソッドは、配列内の要素ごとにこのプロセスを繰り返します。 結果は次のようになります。

OutputHammerhead
Great White
Tiger
Whale

ブロックが1行しかない場合、Ruby開発者がdoおよびendキーワードを中括弧に置き換え、ステートメント全体を次のように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変数に割り当てます。 次に、ブロック内のこれらの変数の両方を参照できます。

このプログラムの結果は次のようになります。

OutputThe 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

Webサイトのデータベースからアイテムを表示する必要がある場合や、ファイルから行を読み取ってその内容を処理する場合など、多くの場合、独自のプログラムで配列内の要素を相互作用します。

結論

配列は、Rubyでのプログラミングの非常に用途が広く基本的な部分です。 このチュートリアルでは、配列を作成し、個々の要素にアクセスしました。 また、配列内の要素を追加、削除、および変更しました。 最後に、配列を反復処理してその内容を表示する2つの方法を検討しました。これは、データを表示するための一般的な方法として使用されます。

チュートリアルRubyのデータ型についてを読んで、Rubyの他のデータ型について学習してください。