こんにちは。Tomoyuki(@tomoyuki65)です。
みなさん、配列やHash(ハッシュ)を聞いたことはありますか?
Rubyでは、配列やハッシュを使うとオブジェクトをまとめることができるんです。
この記事では、そんな配列とハッシュについて解説します。
目次
配列とは?
配列は複数のオブジェクトをまとめることができるオブジェクトです。例として上記図をご覧下さい。
図では、文字列オブジェクトが3つあり、それを配列「pets」にまとめています。
これをプログラムにした場合、以下のように書くことができます。
# 配列の作り方は、[]の中にそれぞれの要素を書きます。
pets = ["ネコ", "イヌ", "インコ"]
# 配列を表示
p pets
配列の要素を指定する方法
配列は各要素を指定することができます。
要素の指定には、添字(インデックス)を指定します。
では以下のプログラムを実行してみて下さい。
# 配列の作り方は、[]の中にそれぞれの要素を書きます。
pets = ["ネコ", "イヌ", "インコ"]
# 添字は0から始まるため、"ネコ"を指定する場合の添字は「0」とする。
p pets[0]
他にも要素の指定方法が色々あります。
以下のプログラムを実行してみて下さい。
# 配列「pets」
pets = ["ネコ", "イヌ", "インコ"]
# 添字はマイナスの値を指定できます。
p pets[-1] # 末尾
p pets[-2] # 真ん中
# 添字は範囲を指定できます。
p pets[0..2] # 0から2までを指定
p pets[0...2] # 0から2の直前までを指定
# 範囲外の添字を指定した場合
p pets[4] # nil(何も無いという意味のオブジェクト)を返す
配列の値を書き換える方法
配列に設定した値は書き換えることができます。
では以下のプログラムを実行してみて下さい。
# 配列「pets」
pets = ["ネコ", "イヌ", "インコ"]
# 1つ目の要素"ネコ"を"ゾウ"に書き換える場合
pets[0] = "ゾウ"
p pets
# 2つ目と3つ目を同時に書き換える場合
pets[1..2] = ["キリン", "カバ"]
p pets
# 要素を追加する場合
pets.push("ペンギン") # pushメソッド
pets << "ラッコ" # 「<<」でpushメソッドを省略した場合
p pets
配列オブジェクトのメソッド
配列にも様々なメソッドがあります。
例として以下のプログラムを実行してみて下さい。
# 配列「pets」
pets = ["ネコ", "イヌ", "インコ"]
# sizeまたはlengthメソッドは要素の数を返す。
p pets.size
p pets.length
# sortメソッドは配列の要素をソートした新しい配列を返す。
p pets.sort
3
[“イヌ”, “インコ”, “ネコ”]
Arrayクラス
配列オブジェクトの元になっているクラスは、Arrayクラスです。
Arrayクラスを使った場合は、以下のように書くことができます。
# Arrayクラスを使った場合
pets = Array["ネコ", "イヌ", "インコ"]
# 配列を表示
p pets
array1 = []
array2 = Array.new # Arrayクラスを使う場合
Hash(ハッシュ)とは?
ハッシュは連想配列とも呼ばれ、配列と同様にオブジェクトをまとめることができます。
ハッシュの場合は、「キー」と「値」をペアでまとめます。
例として上記図をご覧下さい。図では果物の種類(キー)と値段(値)をハッシュ「fruits」にまとめています。
これをプログラムにした場合、以下のように書くことができます。
# 果物の種類と値段をまとめたハッシュ「fruits」
fruits = {"ringo" => 100, "mikan" => 50, "nasi" => 150}
p fruits
実行結果は以下の通りです。
また、ハッシュはシンボル「:」を使った書き方ができます。
以下のプログラムを実行してみて下さい。
# シンボルを使った場合
fruits = {:ringo => 100, :mikan => 50, :nasi => 150}
p fruits
# さらに省略した書き方。
fruits2 = {ringo: 100, mikan: 50, nasi: 150}
p fruits2
シンボルとは?
シンボルは文字列と一対一に対応した記号で、文字列のように見えますが内部では数値として扱われます。
そのため比較や検索などの速度面で有利です。
以下のプログラムを実行してみて下さい。
# 文字列の場合の変数毎のオブジェクトID
str1 = "Apple"
str2 = "Apple"
p str1.object_id
p str2.object_id
# シンボルの場合の変数毎のオブジェクトID
simbol1 = :Apple
simbol2 = :Apple
p simbol1.object_id
p simbol2.object_id
実行結果の通り、文字列の場合は変数毎にオブジェクトIDが異なりますが、シンボルの場合は一意のオブジェクトIDとなります。
ハッシュの要素を指定する方法
ハッシュについても各要素を指定することができます。
要素を指定するには、キーを指定します。
では以下のプログラムを実行してみて下さい。
# キーが文字列の場合
fruits = {"ringo" => 100, "mikan" => 50, "nasi" => 150}
p fruits["ringo"]
# キーがシンボルの場合
fruits = {ringo: 100, mikan: 50, nasi: 150}
p fruits[:ringo] # 「ringo:」でないので注意
ハッシュの値を書き換える方法
ハッシュに設定した値は書き換えることができます。
では以下のプログラムを実行してみて下さい。
# シンボルを使ったハッシュの場合
fruits = {ringo: 100, mikan: 50, nasi: 150}
p fruits
# キー「mikan:」の値を「80」に変える場合
fruits[:mikan] = 80
p fruits
ハッシュの要素を追加するには?
ハッシュに存在しないキーで代入した場合、要素が追加されます。
以下のプログラムを実行してみて下さい。
# シンボルを使ったハッシュの場合
fruits = {ringo: 100, mikan: 50, nasi: 150}
p fruits
# ハッシュに存在しないキー「:meron」に値「900」を代入した場合
fruits[:meron] = 900
p fruits
また、ハッシュに要素を追加する方法として、storeメソッドがあります。
以下プログラムを実行してみて下さい。
# シンボルを使ったハッシュの場合
fruits = {ringo: 100, mikan: 50, nasi: 150}
p fruits
# storeメソッドを使った場合
fruits.store(:mikan, 80) # 値を変更
fruits.store(:meron, 980) # 要素の追加
p fruits
ハッシュオブジェクトのメソッド
ハッシュにも様々なメソッドがあります。
例として以下のプログラムを実行してみて下さい。
# シンボルを使ったハッシュの場合
fruits = {ringo: 100, mikan: 50, nasi: 150}
# 要素数を返すメソッド「size」
p fruits.size
# キーの一覧を返すメソッド「keys」
p fruits.keys
# 値の一覧を返すメソッド「values」
p fruits.values
# キーが存在すれば「true」を返すメソッド「has_key?」
p fruits.has_key?(:mikan)
# ハッシュが空であれば「true」を返すメソッド「empty?」
p fruits.empty?
Hashクラス
ハッシュオブジェクトの元になっているのはHashクラスです。
Hashクラスを使った場合は、以下のように書くことができます。
# Hashクラスを使った場合
fruits = Hash[ringo: 100, mikan: 50, nasi: 150]
p fruits
{:ringo=>100, :mikan=>50, :nasi=>150}
ハッシュと配列の相互変換
ハッシュから配列、配列からハッシュへ相互変換することができます。
ハッシュから配列への変換には「to_a」メソッド、配列からハッシュへは「to_h」メソッドを使います。
では以下のプログラムを実行してみて下さい。
# ハッシュの定義
fruits = {ringo: 100, mikan: 50, nasi: 150}
# ハッシュから配列に変換
p fruits.to_a
# ハッシュから配列に変換し、再度ハッシュに変換
p fruits.to_a.to_h
ハッシュから配列に変換した場合の要素を指定するには?
ハッシュは二つの要素を持っているため、ハッシュから配列に変換した場合は配列の中に配列が設定されます。
その場合も、配列の各要素を指定することができます。
では以下のプログラムを実行してみて下さい。
# ハッシュの定義
fruits = {ringo: 100, mikan: 50, nasi: 150}
# ハッシュから配列に変換後、一つ目の要素を指定
p fruits.to_a[0] # 添字「0」
# 配列の中の配列の一つ目の要素を指定(シンボル「:ringo」を指定したい場合)
p fruits.to_a[0][0]
配列の%記法
文字列には%記法がありますが、配列にも%記法があります。
では以下のプログラムを実行してみて下さい。
# 文字列オブジェクト
neko = "ネコ"
# %Wは式展開可能
pets = %W(#{neko} イヌ インコ)
p pets
# %wは式展開不可
pets2 = %w(#{neko} イヌ インコ)
p pets2
まとめ
- 配列やハッシュを使うとオブジェクトをまとめることができる
- 配列の要素を指定するには、添字(インデックス)を指定する
- 配列の添字は0から始まる
- ハッシュ(連想配列)はキーと値をペアでまとめる
- ハッシュの要素を指定するには、キーを指定する
- ハッシュのキーはシンボルを使った方が速度面で有利
- 配列オブジェクトの元はArrayクラス、ハッシュオブジェクトの元はHashクラス
- 配列やハッシュにも様々なメソッドがあり、よく使うものは覚えよう
- 関連記事
Tomoyuki
最新記事 by Tomoyuki (全て見る)
- Go言語(Golang)専門の技術ブログ「Golang-Tech」を開設!? - 2024年9月26日
- 【2024年】モンハンワイルズの推奨スペックとおすすめのゲーミングPCを紹介! - 2024年9月26日
- 37歳Web系エンジニア3年目。生成AI(ChatGPT・Gemini)現る。 - 2024年7月3日
コメントを残す