😽

[Ruby]配列まとめ!

2023/05/31に公開

配列とは

配列(Array)は、プログラミングにおけるデータ構造の一つ。
Rubyでは、複数の値を順序付けて格納するために使用される。
配列は1つ以上の要素を持ちそれぞれの要素はインデックスを使用しアクセスすることができる。

ex.)

number = [1, 2, 3, 4, 5]
strings = ["a", "b", "c", "d"]

配列の要素は、0から始まるため、0から始まるインデックスを使用してアクセスできる。
ex.)
numbers配列の最初の要素にアクセスする => numbers[0]
fruits配列の2番目の要素にアクセスする => fruits[1]

さまざまな配列の例

さまざまな配列の例

# 文字列の配列
["Samurai", "Ruby", "Rails", "Python"]
 
# 数値の配列
[50, -60, 700, 8000]
 
# ハッシュの配列
 [{ruby: 80}, {python: 70}, {swift: 60}]
 
#配列の入れ子
["Samurai", ["Ruby", "Rails"], "Python"]
 
# オブジェクトが混在した配列
[50, "Samurai", ["Ruby", "Rails"], "Python", {ruby: 80}, 8000]

配列を表示するメソッド

出力メソッドは主に3つある。
以下に記載するprintメソッド、putsメソッド、pメソッドだ。
それぞれ異なる出力メソッドなので、特徴と例とともに書いていきます。

putsメソッド

putsメソッドは、引数として与えられたオブジェクトを出力。
出力後に改行が行われる。
文字列の場合、引用符などの特殊な文字列表現は評価されて表示される。

文字列の表示においてよく使用される。

puts "Hello"       #=> Hello
puts "World"       #=> World

pメソッド

pメソッドは、引数として与えられたオブジェクトを「デバッグ用の表現」として出力。
出力後に改行が行われる。
文字列の場合、引用符などの特殊な文字列表現もそのまま表示されます。

主にデバッグの際に使用され、オブジェクトの内容を確認するのに役立つ。

p "Hello"      #=> "Hello"
p "World"   #=> "World"

printメソッド

引数として与えられたオブジェクトをそのまま出力する。
出力後に改行は行われない。
文字列の場合、引用符などの特殊な文字列表現はそのまま表示されます。

print "Hello"
print "World"
  #=> HelloWorld

それぞれの違いをtableにしてみました。

メソッド 概要 改行の有無 引用符や特殊文字の表示 主な使用場面
print 引数のオブジェクトをそのまま出力する 改行なし 特殊文字をそのまま表示 ファイルへの出力や、改行を制御したい場合
puts 引数のオブジェクトを出力し、改行を行う 改行あり 特殊文字を評価して表示 コンソール上での表示や、可読性のある出力が必要な場合
p 引数のオブジェクトをデバッグ用の表現として出力する 改行あり 特殊文字をそのまま表示 デバッグやオブジェクトの内容確認が必要な場合

配列を作成する

■ 要素数が0個の空の配列

arr = []  #=>[]

■ 新しく配列を作成

arr = Array.new  #=>[]

■ 要素数を指定

arr = Array.new(4) #=>[nil, nil, nil, nil]

■ 要素数を指定して値を格納

arr = Array.new(3, "white") #=>["white", "white", "white"]

■ 要素のインデックスを引数としブロックを実行

arr = Array.new(3){ | index | "apple#{index}" }
  #=>["apple0", "apple1", "apple2"]

配列の要素数を取得

要素数を取得するメソッドとして2つ。
配列や文字列などの要素数を返すことには同じだが、違い点としては、
ハッシュで使用できるか、できないかだ。

.lengthメソッド

ハッシュでは使用できない。

array = [1, 2, 3, 4, 5]
puts array.length     #=> 5

string = "Hello, world!"
puts string.length    #=> 13

range = 1..10
puts range.length    #=> 10

.sizeメソッド

ハッシュで使用でき、ハッシュではキー-値ペア数を返す。

hash = { "a" => 1, "b" => 2, "c" => 3 }
puts hash.size     #=> 3

another_array = []
puts another_array.size     #=> 0

lengthメソッドとsizeメソッドの比較をtableでまとめました。

メソッド 概要 違い 使用場面
length 配列や文字列などの要素数を返す ハッシュでは使用できない 要素数の取得、文字列の長さの取得、範囲の要素数の取得
size 配列や文字列などの要素数を返す ハッシュではキー-値ペア数を返す 要素数の取得、文字列の長さの取得、範囲の要素数の取得、ハッシュのキー-値ペア数の取得

要素の追加メソッドについて

追加メソッドはさまざまあるが、今回は、
破壊的なメソッド(destructive method)と非破壊的なメソッド(non-destructive method)の
2つの種類の要素追加メソッドについて分類して書いていきます。

破壊的なメソッド(destructive method)

破壊的なメソッドは、元の配列を変更して要素を追加する
具体的には、元の配列が変更され、変更後の配列が返される。
以下のようにpushメソッドや<<が当てはまります。

■ pushメソッド

pushメソッドは、配列の末尾に要素を追加します。
pushメソッドはエイリアスメソッドとして<<(ショベル演算子)も使用できる。

補足:エイリアスメソッド(Alias Method)とは

エイリアスメソッド(Alias Method)とは

Rubyにおいて同じ機能を持つメソッドに対して別の名前を付ける機能のこと。
つまり、異なるメソッド名で同じ処理を行うことができるもの!

array = [1, 2, 3]
array.push(4)

puts array.inspect  #=> [1, 2, 3, 4]

array << 5

puts array.inspect  #=> [1, 2, 3, 4, 5]

<<(ショベル演算子)

<<は、配列の末尾に要素を追加するためのショベル演算子。
pushメソッドと同様に配列の末尾に要素を追加。

array = [1, 2, 3]
array << 4

puts array.inspect  #=> [1, 2, 3, 4]

■ appendメソッド

appendメソッドは、配列の末尾に要素を追加。
appendメソッドはRuby 2.6以降で使用できる。

array = [1, 2, 3]
array.append(4)

puts array.inspect  #=> [1, 2, 3, 4]

非破壊的なメソッド

非破壊的なメソッドは、元の配列を変更せずに新しい配列を作成して要素を追加。
具体的には、新しい配列が作成され、元の配列は変更されない。

演算子

2つの配列を結合して新しい配列を作成。
既存の配列を変更せずに新しい配列を作成することができる!
結合される2つの配列は変更されず、新しい配列が作成される点に注意!

ex.)

array1 = [1, 2, 3]
array2 = [4, 5, 6]

new_array = array1 + array2

puts new_array.inspect  #=> [1, 2, 3, 4, 5, 6]
puts array1.inspect     #=> [1, 2, 3](変更されていない)
puts array2.inspect     #=> [4, 5, 6](変更されていない)


配列の要素を繰り返す eachメソッド

eachメソッドを使用する方法について記述します。
配列では、eachメソッドとブロック(do~end)を使うことで、要素分の繰り返し処理が可能になる。

eachメソッドは配列の要素を一つずつ取り出して繰り返し処理を行う。

基本形としては、

配列オブジェクト.each do |変数|
  #繰り返したい処理
end

では例にしながらみる。

fruits = ["りんご", "ばなな", "オレンジ"]

このようなコードがあったとして...

fruits.each do |fruit|
  puts fruit
end

出力させると以下のように出力される。

# =>りんご
# =>ばなな
# =>オレンジ

繰り返し処理に関してまたここは特集したいと思う。


Hash(ハッシュ)について

RubyにおけるHashとは、ハッシュテーブルによる連想配列で、任意のオブジェクトにいるキーと、
任意のオブジェクトによる値とを関連付け
をするもの。

キーと値のペアを関連付けてデータを格納するデータ構造。
キーは一意であり、それに対応する値を取得することができる。

Keyは数字と違いなんらかの意味を持つので、コードが読みやすくなるという利点もある!

ハッシュは連想配列とも呼ばれ、
他のプログラミング言語では連想配列やマップとして知られている。

■ ハッシュの作成

ハッシュは波括弧{}を使って作成。
キーと値のペアはコロン:または=>を使用して記述する。
基本的な構文の例

# ハッシュの作成
hash = { key1: value1, key2: value2, key3: value3 }

ハッシュでは、キーを使用して値にアクセスすることができる
[] 演算子を使ってキーを指定し、値を取得する。

# ハッシュの要素にアクセス
puts hash[:key1]   #=> value1
# Hash family_hash を定義
family_hash = { "tsuma" => "sazae", "otto" => "masuo", "kodomo" => "tarao" }  

# Hash family_hash から値を取り出す
puts family_hash["tsuma"]   # sazae と表示
puts family_hash["otto"]    # masuo と表示
puts family_hash["kodomo"]  # tarao と表示

Hashのkeyにはシンボルの使用が可能

■ Symbolとは

Rubyの内部実装では、
メソッド名や変数名、定数名、クラス名などの`名前'を整数で管理しています。
これは名前を直接文字列として処理するよりも速度面で有利だからです。
そしてその整数をRubyのコード上で表現したものがシンボルです。

一意で変更不可なオブジェクトであり、特定の識別子や名前を表すために使用される。
シンボルはコロン:を先頭に付けて表現され、コード内で再利用される固定の値を表す。

ただし!文字列を" "で囲む必要はない!! なぜなら、
シンボルは、見た目は文字列のように見えますが
内部では整数で扱われているシンボルというオブジェクトなのだ。

Symbolはハッシュのキーとして使用される

シンボルはRubyにおいてハッシュのキーとして頻繁に使用される。

ハッシュのキーとしてシンボルを使う利点

■ 高速な検索:
シンボルは整数として内部的に表現されるため、ハッシュ内でのキーの検索が非常に高速
文字列と比較して効率的に動作する。

■ シンボルの一意性:
同じシンボルリテラルは常に同じオブジェクトを参照するため、
ハッシュのキーとしてシンボルを使用することで一意性が保証される。

ex.)

# ユーザーの情報を保持するハッシュ
user = {
  name: "Alice",
  age: 25,
  email: "alice@example.com"
}

# ハッシュのキーとしてシンボルを使用して値をアクセスする
puts user[:name]  #=> "Alice"
puts user[:age]   #=> 25
puts user[:email] #=> "alice@example.com"

他、symbolが利用される場面の例について

他、symbolが利用される場面の例

■ 定数としての使用:

シンボルは定数の識別子として使用されることもある。
一意の識別子を使用して定数を管理することができる。
ex.)シンボルを使用して定数を定義し、他の部分で参照することができる。

STATUS_OK = :ok
STATUS_ERROR = :error

puts STATUS_OK    #=> :ok
puts STATUS_ERROR #=> :error

■ 列挙型(Enum)の代替としての使用:

シンボルは列挙型(Enum)の代替として使用されることがある。
複数の状態やオプションを表現するために、異なるシンボルを使用することで
明示的な値を指定することができます。
ex.)シンボルを使用して異なる状態を表現することができる。

status = :pending

case status
when :pending
  puts "Processing is pending."
when :approved
  puts "Processing is approved."
when :rejected
  puts "Processing is rejected."
else
  puts "Unknown status."
end

補足:文字列とsymbolの違い

以下は、シンボルと文字列の違いをtableでまとめたものです。

シンボル (Symbol) 文字列 (String)
表現 :symbol_name "string"
一意性 一意で変更不可 重複が可能で変更可能
変更性 不変 変更可能
比較 高速な整数ベースの比較 文字単位での比較
メモリ使用量 一意のオブジェクト 各文字のためにメモリを使用
主な使用場面 ハッシュのキー、メソッド名、識別子 テキストの表現、可変のデータ

シンボルは一意で変更不可なオブジェクトであり、高速な比較やメモリ使用量の面で利点があります。一方、文字列は変更可能で、テキストの表現や可変のデータとして使用されます。

適切な選択は使用場面に依存します。シンボルは主に識別子やハッシュのキーとして使用され、文字列は一般的なテキストの表現に使用されます。

配列とハッシュの違い

一度tableにしてみました。

配列 ハッシュ(連想配列)
格納方法 要素を順序付けして格納 キーと値のペアを関連付けて格納
データの関連付け 要素の順序に基づく キーを使用して値にアクセス
インデックス 0から始まる整数のインデックス キーによるアクセス
重複の扱い 重複した要素を含めることができる 重複したキーのペアを持つことはできない
順序 追加された順序を維持 キーの順序は保証されない
使用目的 複数の要素を順序付けて保持 キーと値の関連付けや索引付け

Discussion