配列とハッシュ

ここでは、Rubyのデータ構造の一種である配列とハッシュの説明をします。

データ構造とは、その名の通りデータをどのように管理するかの構造であり、プログラムで複雑なデータを扱う際には、非常に重要です。

実は、データ構造は配列やハッシュ以外にもたくさんあるのですが、よく使われる配列とハッシュに絞って説明していきます。

配列

最初に配列について説明していきます。

配列では、複数のデータをまとめて管理することができます。

次に配列の作り方と使い方の例を示します。

# 配列の作成(どちらも書き方が違うだけで、やっていることは同じ)
array1 = [1, 2, 3, 4, 5]
array2 = Array.new()

# データの追加
array2.push(1)
array2.push(2)
array2.push(3)
array2.push(4)
array2.push(5)

# データの参照
puts array1[0]
puts array1[1]
puts array1[2]
puts array1[3]
puts array1[4]

# 値の変更
array1[0] = 100
array1[1] = 200
array1[2] = 300
array1[3] = 400
array1[4] = 500

配列の作成には、[]で囲ってそこに,(カンマ)で区切ってデータを記述する方法や、Array.new()を使う方法があります。

配列への値の追加は.pushを使用します。

配列のデータの参照(アクセスとも言います)は、変数名の後ろに[]を書きその中にインデックスと呼ばれる数値を書きます。このインデックスは、0から始まる数値で0ならば1番目のデータ、1ならば2番目のデータを参照します。

配列ではすでにあるデータの値を書き換えることができます。書き換える際は、参照の際と同じように記述した後に=を使います。

この例では、データとして数値を使用しましたが、文字列を使うこともできます。さらに、数値や文字列のデータを混ぜることも可能です。

# 配列の作成(どちらも書き方が違うだけで、やっていることは同じ)
array1 = [1, 'Apple', 'Banana', 4, 'Orange']
array2 = Array.new()

# データの追加
array2.push(1)
array2.push('Apple')
array2.push('Banana')
array2.push(4)
array2.push('Orange')

# データの参照
puts array1[0]
puts array1[1]
puts array1[2]
puts array1[3]
puts array1[4]

また、配列では、複数のデータをまとめて参照することができます。

# まとめて参照
puts array[0..2] # 1, 2, 3
puts array[1..-1] # 2, 3, 4, 5

.(ピリオド)を使用して、まとめて参照したいデータの範囲を指定することもできます。0..2ならば、0, 1, 2をインデックスとしてそれぞれ参照したものとなります。このような0..2をRangeといいます。

特殊なものとして、範囲指定の最後の部分に-1を指定する1..-1のような場合は、配列の最後まで参照すると言うことになります。つまり、インデックスとして1を指定して、配列の最後までインデックスを書いたのと同じとなります。

以上が配列の説明となりますが、これで何ができるんだと思うかもしれませんが、今後説明する繰り返し処理では、非常に便利なデータ構造ですので、しっかりと覚えておきましょう。

ハッシュ

ハッシュは、配列に似たデータ構造となっています。配列との大きな違いとして、配列で言うところのインデックスの値として数値以外も使うことができます。

次に例を示します。

# ハッシュの作成
hash1 = { Apple: 1, Banana: 2, Orange: 3 }
hash2 = { 1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5 }
hash3 = Hash.new

# 値の追加
hash3[:Apple] = 1
hash3[:Banana] = 2
hash3[:Orange] = 3

# 参照
puts hash1[:Apple]
puts hash1[:Banana]
puts hash1[:Orange]

# 値の変更
hash3[:Apple] = 100
hash3[:Banana] = 200
hash3[:Orange] = 300

ハッシュでは、Apple: 1とあった場合に、Appleの部分をキー(Key)、1の部分をバリュー(Value、値とも言う)と呼びます。そのため、ハッシュはキーを使用して、値を参照するデータ構造とも言います。

ハッシュは、{}で囲った中にデータを記述することで作成できます。{}の中では、文字列をキーとする場合は、Key: Valueとして,(カンマ)でデータを区切って記述します。

キーに数値を指定する場合は文字列と同じように記述することはできず、Key => Valueのように記述します。しかし、ハッシュでキーに文字列以外を使うことはあまりないため、このような記述をすることは少ないです。

ハッシュでは配列と同じようにデータを追加することもでき、データを追加する場合は、配列と似たような記述をし、配列で言うところのインデックスの部分にキーを指定します。キーが文字列の場合は、:Keyのような形で記述します。

ハッシュの値を参照する場合は、値の追加と同じように変数名[:キー]として参照します。

値の変更は、値の追加と同じような書き方をします。これは、すでにキーが登録されている場合は値を上書きし、登録されていない場合は、そのキーとバリューの組み合わせを登録することを表してます。

ハッシュについても、配列と同じように数値や文字列のデータを混ぜることができます。

# ハッシュの作成
hash1 = { Apple: 'Apple', Banana: 2, Orange: 3 }
hash3 = Hash.new

# 値の追加
hash3[:Apple] = 'Apple'
hash3[:Banana] = 2
hash3[:Orange] = 3

# 参照
puts hash1[:Apple]
puts hash1[:Banana]
puts hash1[:Orange]

# 値の変更
hash3[:Apple] = 100
hash3[:Banana] = 'Banana'
hash3[:Orange] = 'Orange'

ハッシュも配列と同じように、今後どのように役に立つのか分かりにくいと思うかもしれません。

しかし、このようなデータ構造はプログラムを書いていく上で、頻繁に登場します。そのため、しっかりと覚えておきましょう。

まとめ

配列やハッシュでは他にもいろいろな操作をすることができるのですが、ここでは必要最低限のものに絞って説明をしました。

配列やハッシュなどのデータ構造は、プログラムを作る上でなくてはならないものですので、忘れたら何度も見直しながら、しっかりと理解しましょう。