Ruby ハッシュ
ハッシュ
ハッシュとは(連想配列、ディレクショナリ、マップ)
- キーと値の組み合わせでデータを管理するオブジェクト
ハッシュ
# 空のハッシュを作成
{}
# キーと値の組み合わせを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