📝

Ruby ハッシュ

2023/02/06に公開

ハッシュ

ハッシュとは(連想配列、ディレクショナリ、マップ)

  • キーと値の組み合わせでデータを管理するオブジェクト

ハッシュ

# 空のハッシュを作成
{}
# キーと値の組み合わせを3つ格納するハッシュを作成
{キー1 =>1, キー2 =>2, キー3 =>3}


irb

空のハッシュを作成

h = {}
=> {}

空のハッシュhを出力

puts h
{}
=> nil

ハッシュを宣言して初期値として代入
ハッシュは名前と出生地を含めるものとする

名前のキーはname,値はNakamura
出生地のキーはbirthplace,値はNagano

nakamura = {'name' => "Nakamura', 'birthplace' => 'Nagano'}
=> {"name"=>"Nakamura", "birthplace"=>"Nagano"}

ハッシュから名前を取り出したいとき

ハッシュからキーがnameの値を取り出して出力するには

puts nakamura['name']
Nakamura
=> nil

Nakamuraが出力された

値の追加

年齢20歳を追加

nakamura['age'] = 20
=> 20

ハッシュnakamuraを出力すると

puts nakamura
{"name"=>"Nakamura", "birthplace"=>"Nagano", "age"=>20}
=> nil

age20が追加された!

キーを指定して値を削除したいとき

nakamura.delete('age')
=> 20

ハッシュnakamuraを出力すると

puts nakamura
{"name"=>"Nakamura", "birthplace"=>"Nagano"}
=> nil

age20が削除された!

キーにシンボルを使ったハッシュの扱いについて

今までキーには文字列を使っていたが、シンボルというものにしてみる

シンボルはソースコード上では文字列のように見えるが
内部では整数として扱われる両者を中立するような存在

シンボルを使ったキーの方が文字列をキーに使う場合に比べて
ハッシュのアクセスは早いとされる

名前と出生地を持ったハッシュをシンボルを使って書いてみる
nameがキー,Satoがvalue(値)
birthplaceがキー、Tokyoがvalue(値)

sato = { name: 'Sato', birthplace: 'Tokyo'}
=> {:name=>"Sato", :birthplace=>"Tokyo"}

ハッシュsatoを出力

puts sato
{:name=>"Sato", :birthplace=>"Tokyo"}
=> nil

シンボルの場合はこのように表現される!
:name

ハッシュからキーがnameの値を取り出したい場合

puts sato[:name]
Sato
=> nil

Satoが出力された

値を追加したい時

sato[:age] = 20
=> 20

出力すると

puts sato
{:name=>"Sato", :birthplace=>"Tokyo", :age=>20}
=> nil

ageが追加された

値を変更したいとき

sato[:age] = 21
=> 21

puts sato
{:name=>"Sato", :birthplace=>"Tokyo", :age=>21}
=> nil

ageが21に変更された!

値を削除したいとき

sato.delete(:age)
=> 21

puts sato
{:name=>"Sato", :birthplace=>"Tokyo"}
=> nil

キーageの値が削除された!

繰り返し処理each

繰り返し処理のeachを使ってハッシュから1個ずつ値を取り出して
何かしらの処理を実行する

変数が入ったハッシュを作る

scores = {luke: 100, jack: 90, robert: 70}
=> {:luke=>100, :jack=>90, :robert=>70}

ハッシュを出力

puts scores
{:luke=>100, :jack=>90, :robert=>70}
=> nil

このハッシュから値を1個ずつ取り出して
putsで出力してみる

scores.each { |k, v| puts v}
100
90
70
=> {:luke=>100, :jack=>90, :robert=>70}

値を1個ずつ取り出して処理
変数kにはキーが入って、変数vには値(value)が入る

puts vで変数vに入っている値をターミナルに出力する
100,90,70と出力された

kとv、両方出力してみる

scores.each{ |k, v| puts "#{k}, #{v}"}
luke,100
jack, 90
robert, 70
=> {:luke=>100, :jack=>90, :robert=>70}

キーと値が両方とも出力できた

scoresの中でスコアが80点以上のものだけターミナルに出力

 scores.each { |k, v|
   if v >= 80
     puts "#{k}, #{v}"
   end
   }
luke, 100
jack, 90   

スコアが80点以上であるlukeさんとjackさんが出力された

ハッシュが持っているキーの一覧を知りたい時

scores.keys
=> [:luke, :jack, :robert] 

キーだけが出力された

ハッシュが持っている値の一覧を知りたい時

scores.values
 => [100, 90, 70]

値だけが出力された

ハッシュが指定したキーを持っているか確認

scores.has_key?(:luke)
=> true

ハッシュscoresはキーlukeを持っているのでtrueとなる

キーがない場合

scores.has_key?(:takahashi)
=> false

キーtakahashiはないのでfalseとなる

ハッシュのサイズを確認

scores.size
=> 3

キーバリューのペアの個数が返された


体調あんま良くないから今日はここまで!
明日も頑張ろう
退職するって伝えるまでは不安しかなかったのに、
伝えてからなんかじわじわとワクワクしてきてる
同じところにずっといて安心し切ってる人生なんてつまんないやっぱ
何事も挑戦し続けたい!

Discussion