[Ruby]配列とハッシュに関して

# 対象読者
プログラミング初学者

# 配列に関して
配列(array)は複数の値をまとめて管理したいときに使用する。
配列内で管理されるものは”要素(element)”と呼ばれる。

##配列の定義のしかた

```ruby
#例1
array = Array.new

#例2
fruits = ["apple", "banana"]
```

##配列に要素を追加する方法

型は以下の通り。

```ruby
配列.push(追加する要素)
```

例えば

```ruby
#空の配列を用意して
array = Array.new

#"A"を追加するには
array.push("A") 
puts array # 出力結果 ["A"]
```

また、一度に複数の要素を追加したい時は

```ruby
#先ほどの配列をそのまま適用すると
array.push("B", "C")  
puts array # 出力結果 ["A", "B", "C"]
```

## 要素の間に要素を追加（挿入）する方法

型は以下の通り。

```ruby
配列.insert(挿入位置, 挿入する要素)
```

例えば

```ruby
#以下の配列があったとして
array = ["A", "B", "D"]

#"C"を挿入する場合は
array.insert(2, "C")
puts array # 出力結果 ["A", "B", "C", "D"]
```

また、一度に複数の要素を挿入したい時は、第３引数以降に要素を渡す。

```ruby
#先ほどの配列をそのまま適用すると
array.insert(2, 1, 2) 
puts array # 出力結果 ["A", "B", 1, 2, "C", "D"] 
```

##配列内の要素を削除する方法
型は以下の通り。

```ruby
配列.delete(削除する要素)
```

例えば

```ruby
#以下の配列があったとして
array = ["A", "B", 1, 1, 2, "C", "D"] 

#1を削除するには
array.delete(1) 
puts array # 出力結果 ["A", "B", 2, "C", "D"]
```
()内の引数に渡した要素と一致するものをすべて配列から削除する。

##指定位置の要素を削除する方法
型は以下の通り。

```ruby
配列.delete_at(削除位置)
```

例えば

```ruby
#以下の配列があったとして
array = ["A", "B", 2, "C", "D"]

#2を削除するには
array.delete_at(2)
puts array # 出力結果 ["A", "B", "C", "D"]
```

## 指定範囲の要素を削除する方法

型は以下の通り。

```ruby
配列.slice!(削除開始位置, 削除する長さ)
```

例えば

```ruby
#以下の配列があったとして
array = ["A", "B", 1, 1, 2, "C", "D"] 

#1,1,2を削除するには
array.slice!(2, 3) # 出力結果 ["A", "B", "C", "D"]

#または
array.slice!(2..4)

#上記の型は
配列.slice!(削除範囲)
```

## 配列の中の要素を取り出す方法

型は以下の通り。

```ruby
array[要素番号]
```

例えば

```ruby
#以下の配列があったとして
array = ["A", "B", "C", "D"]

# "A"を取得するには
puts array[0] # 出力結果 "A" 
```
# ハッシュに関して
キーとバリュー（値）を組み合わせて保持するデータ構造のこと。
配列は一つの要素にオブジェクトが一つ入っていたのに対して、ハッシュはオブジェクトがキーとバリューの二つ入っている。

##ハッシュの定義のしかた

```ruby
#例1
hash = Hash.new

#例2
user = {user1: "たけし", user2: "たかし"}
```

## 要素を追加する方法

型は以下の通り。

```ruby
ハッシュ[追加したい要素のキー] = 値
```

例えば

```ruby
#以下の配列があったとして
users = {user1: "たけし", user2: "たかし"}

# キーがuser3、バリューがけんじの要素を追加するには
users[:user3] = "けんじ"
puts users # 出力結果  {:user1=>"たけし", :user2=>"たかし", :user3=>"けんじ"}
```

そのほかの追加の方法としては、以下があります。

```ruby
ハッシュ.store(追加したい要素のキー, 値)
```

具体例は以下の通り。

```ruby
#以下の配列があったとして
users = {user1: "たけし", user2: "たかし"}

# キーがuser3、バリューがけんじの要素を追加するには
users.store("user3", "けんじ")
puts users # 出力結果  {:user1=>"たけし", :user2=>"たかし", :user3=>"けんじ"}
```

## 要素を削除する方法
型は以下の通り。

```ruby
ハッシュ.delete(削除したい要素のキー)
```

例えば

```ruby
#以下の配列があったとして
users = {:user1=>"たけし", :user2=>"たかし", :user3=>"けんじ"}

# キーがuser3、バリューがけんじの要素を削除するには
users.delete("user3")
puts users # 出力結果  {:user1=>"たけし", :user2=>"たかし"}
```
値が(キーと一緒に)ハッシュから取り除かれる。

## ハッシュの中の特定のバリューを取得する方法

型は以下の通り。

```ruby
ハッシュオブジェクト[:キー名]
```

例えば

```ruby
#以下の配列があったとして
users = {:user1=>"たけし", :user2=>"たかし"}

# "たかし"を取り出す時は
puts users[:user2]
```

## ハッシュの中のバリュー一覧を取得する方法
例えば

```ruby
#以下の配列があったとして
users = {:user1=>"たけし", :user2=>"たかし"}

puts users.values # 出力結果 たけし, たかし
```

## ハッシュの中のキー一覧を取得する方法
例えば

```ruby
#以下の配列があったとして
users = {:user1=>"たけし", :user2=>"たかし"}

puts users.keys # 出力結果 [:user1, :user2]
```

# 問題
配列の内部に、複数のユーザーの情報をハッシュとして持つ変数user_dataがある。
user_dataを利用して、全てのユーザーの名前だけが出力されるようにRubyでコーディングしてください。

```ruby
user_data = [
             {user: {profile: {name: 'George'}}},
             {user: {profile: {name: 'Alice'}}},
             {user: {profile: {name: 'Taro'}}}
             ]
```

##　解答
```ruby
user_data.each do |u|
  puts u[:user][:profile][:name]
end

#または
user_data.each{ |u| puts u.dig(:user, :profile, :name) }
```