Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyの配列(Array)クラスの使い方徹底解説!基本操作と便利なメソッド一覧

配列(Array)とは?

配列はRubyに組み込まれたクラスで、0個以上の要素をリスト形式で保持することができます。さらに、要素の追加・アクセス・繰り返し処理を簡単に行えるメソッドも多数用意されています。

もし配列が存在しなければ、値ごとに個別の変数を用意しなければならず、管理が非常に大変になります。

例:

a = 1
b = 2
c = 3

しかし、配列を使えば次のように書けます:

numbers = [1, 2, 3]

さらに嬉しいことに、配列の中には何でも入れられます!

例えば:

  • 数値
  • 文字列
  • さらに別の配列!(これは多次元配列になります)

それでは、配列を最大限に活用できるよう、詳しく学んでいきましょう!

配列は「0始まり」のインデックスを持つ

配列内の要素にはインデックスを使ってアクセスできます。このインデックスは0から始まる点に注意しましょう。

例えば、「cat」「dog」「tiger」という単語が入った配列の場合、各要素とインデックスの対応は以下のようになります。

Rubyの配列(Array)クラスの使い方徹底解説!基本操作と便利なメソッド一覧

上の図のデータをコードで表すと、次のようになります。

["cat", "dog", "tiger"]

それでは、配列でできることを順番に見ていきましょう!

Ruby配列の基本メソッド

まずは配列の作成方法から学びます。

空の配列を作って後から要素を追加する方法と、初期値を設定した状態で配列を作る方法があります。

空の配列を初期化する:

users = []

データ付きで配列を初期化する:

users = ["john", "david", "peter"]

文字列だけの配列を作る場合は、%wを使うことで、文字列ごとに引用符を記述する手間を省けます。

例:

users = %w(john david peter)

配列が用意できたら、中の要素にアクセスしてみましょう。

アクセス方法は次の通りです:

users[0] # 配列の最初の要素
users[1] # 配列の2番目の要素
users[2] # 配列の3番目の要素

firstlastメソッドを使うこともできます。

users.first # 配列の最初の要素
users.last  # 配列の最後の要素

配列に要素を追加する方法はこちらです。

# どちらも同じ効果ですが、<< の方がよく使われます。
users.push "andrew"
users << "andrew"

配列から要素を削除する方法はこちらです。

last_user = users.pop # 配列の末尾の要素を取り出して返す(配列からは削除される)
user.delete_at(0)     # 配列の先頭の要素を削除する

また、shiftunshiftメソッドもあります。これらはpop/pushに似ていますが、配列の先頭に対して要素を追加・削除する点が異なります。

users.unshift "robert"  # 配列の先頭に要素を追加する
users.shift             # 配列の先頭の要素を取り出して返す(配列からは削除される)

「この配列に特定の要素が含まれているか?」を調べたいこともありますよね。

Rubyで配列に値が存在するかチェックする:

numbers = [1,2,3]

numbers.include?(2)
# => true

numbers.include?(10)
# => false

配列の長さは?(=何個の要素が入っているか)

words = ["cat", "coconut", "bacon"]
words.size

# => 3

覚えておきたいチートシートはこちら:

操作 メソッド
初期化 Array.new、[]、%w
読み取り [0]、first、last
追加 push、<<、unshift
削除 pop、delete_at、shift

配列を文字列に変換する方法

Array#joinメソッドを使うと、どんな配列でも文字列に変換できます。

例:

letters = %w(a b c d)
letters.join

# => "abcd"

このメソッドは省略可能な引数を1つ受け取るので、要素を結合する際の区切り文字を指定することもできます。

letters = %w(a b c d)
letters.join(" ")

# => "a b c d"

逆に、文字列から配列へ変換したい場合はsplitメソッドを使います。

"a b c".split

結果は次の通りです。

["a", "b", "c"]

多次元配列(2次元配列など)

配列の中に別の配列を入れることもでき、これを「多次元配列」と呼びます。

2次元配列の例:

users = [
 [1, 'Peter'],
 [2, 'Steven']
]

最初のサブ配列の1つ目の要素にアクセスするには、次のような構文を使います。

users[0][0]

# => 1

最初のサブ配列の2つ目の要素なら、こうなります。

users[0][1]

# => 'Peter'

多次元配列を通常の配列(平坦な配列)に変換したいケースもあります。その場合はflattenメソッドを使いましょう。

users.flatten

# => [1, "Peter", 2, "Steven"]

配列の繰り返し処理(イテレーション)

配列の中身を順番に取り出して表示できたら便利ですよね。もちろん、それも可能です!

例:eachで配列の中身を表示する

users.each { |item| puts item }

値とインデックスの両方を扱いたい場合は、each_with_indexメソッドを使います。

users.each_with_index { |item, idx| puts "#{item} のインデックスは #{idx}" }

ポイント:これらのループ処理の多くは、Enumerableモジュールによって提供されています。このモジュールはArrayクラスにデフォルトでミックスインされています。

例:mapで配列内のすべての単語を大文字始まりに変換する

users = users.map { |user| user.capitalize }
users = users.map(&:capitalize)

mapメソッドは元の配列を直接書き換えません。変更済みの要素を含む新しい配列を返すだけなので、結果を変数に代入し直す必要があります。

破壊的メソッドのmap!(感嘆符に注目)を使うと配列そのものを直接変更できますが、一般的にはシンプルな非破壊版の方が推奨されます。

また、条件に合致する要素だけを配列から探したい場面もあるでしょう。

例:10より大きい数値をすべて見つける

numbers = [3, 7, 12, 2, 49]
numbers.select { |n| n > 10 }
# => [12, 49]

負のインデックス(ネガティブインデックス)

配列の特定の要素にアクセスするには、インデックスを使う(またはfirstlastなどのメソッドを使う)と学びました。

では、負のインデックスについてはどうでしょうか?

-1のように、マイナスの値をインデックスとして使うことです。

Rubyは配列の末尾から数えます。つまり、-1は最後の要素、-2は後ろから2番目の要素、という具合になります。

例:

letters = ["a", "b", "c"]

letters[-1]
# => "c"

letters[-2]
# => "b"

その他の便利な配列操作

配列を使えば、並べ替え(ソート)やランダムな要素の取得など、さまざまな操作が可能です。

sortメソッドで配列をソートできます。配列の中身が文字列や数値だけであれば問題なく動作します。より高度なソートが必要な場合はsort_byをチェックしてみてください。

numbers = numbers.sort

重複した要素を取り除くこともできます。この操作を頻繁に行うなら、代わりにSetクラスの使用を検討するとよいでしょう。

numbers = [1, 3, 3, 5, 5]
numbers = numbers.uniq
# => [1, 3, 5]

注意したいのは、この操作だけでは元の配列は恒久的に変更されないという点です。Rubyの多くのメソッドは、変更を加えた新しい配列を作成して返します。結果を保存したい場合は変数に代入するか、この例のようにuniq!メソッドを使いましょう。

配列からランダムに1つの要素を取り出したい場合はsampleメソッドを使います。

numbers.sample

配列全体ではなく、一部だけを「スライス」したいこともありますよね。

例:元の配列を変更せずに、最初の3要素を取得する

numbers.take(3)
numbers[0,3]

より高度な配列スライシングも可能です。例えば、最初の要素以外をすべて取得したい場合はこう書きます。

numbers[1..-1]

カンマ(0,3)と範囲(1..-1)の違いに注目してください。前者は「インデックス0から3つの要素を取得する」、後者は「指定した範囲内の要素をすべて取得する」という意味になります。

配列のサイズを取得する:

numbers.size
# => 5

配列が空かどうかを確認する:

numbers.empty?
# => false

nilの要素を取り除く:

numbers << nil
# => [1, 3, 3, 5, 5, nil]

numbers.compact
# => [1, 3, 3, 5, 5]

複数の配列に対する操作

2つの配列を1つに結合・統合したい場合は、次のように行えます。

# こちらの方が高速(既存のusers配列を直接変更するため)
users.concat(new_users)  

# こちらは新しい配列を作るため、やや遅い
users += new_users       

ある配列から要素を除外することもできます。以下の例では、users_to_deleteも配列です。

users = users - users_to_delete

最後に、2つの配列の両方に存在する共通要素を取得する方法です。

users & new_users

まとめ

Rubyの配列は非常に便利で、開発における強力な味方になってくれるでしょう。

ぜひ、配列の作成、要素の追加、インデックスによるアクセスなどを実際に手を動かして練習してみてください。あわせてもう1つの重要なクラスである「ハッシュ(Hash)」についても学んでみましょう。配列と組み合わせることで、より表現力のあるコードが書けるようになります。

継続的な練習こそが、上達への近道です!

  1. Rubyのmapメソッド完全ガイド!配列・ハッシュのデータ変換を実例で解説

    Rubyのmapメソッドは、配列(Array)・ハッシュ(Hash)・範囲(Range)といったコレクションに対して使用できる強力なメソッドです。 mapの主な用途は、データの変換です。 例えば、文字列の配列があった場合、すべての文字列を順番に処理して、各文字を大文字に変換することができます。 また、Userオブジェクトのリストがある場合も同様です。 それらを変換して、対応するメールアドレスや電話番号など、Userクラスに定義された任意の属性のリストを作成できます。 それでは、具体的な使い方を見ていきましょう! Ruby mapメソッドの基本構文 mapの構文は次のようになっています。 a

  2. RubyのStructとOpenStructの使い方を徹底解説!値オブジェクトを簡単に作る方法

    Rubyには、関連する属性をまとめて保持する「値オブジェクト」を手軽に作れるStructという組み込みクラスが用意されています。本記事では、Structの基本的な使い方から注意点、そしてOpenStructとの違いまで詳しく解説します。 そもそもStructとは何か? StructはRubyに組み込まれたクラスで、新しいクラスを動的に生成し、値オブジェクト(Value Object)を作成するために使われます。値オブジェクトとは、関連性のある複数の属性をひとまとめにして扱うためのオブジェクトです。 具体例を挙げてみましょう。 2つの座標(xとy)を持つPointというデータを表したい場合、この