ハッシュについて

Kazunori Kamiya
6 min readSep 2, 2017

--

・Exercise39:ハッシュ

ここではRubyにおける、ハッシュマップというデータ構造について学んでいきます。
ハッシュマップ(通称ハッシュ)は、リストのようにデータを溜め込むことのできるものですが、データを得る際に数字を使う代わりに、殆ど何でも使うことができます。
これによって、ハッシュをデータを溜めたりまとめたりするためのデータベースのように扱えます。

早速、配列と比べてハッシュでは何ができるのか見ていきましょう。
まず配列では、以下のようなことが可能です。

配列に対するインデックスは数字で指定できますが、これはつまり配列の中に何があるかは、数字を使えばわかるということです。
これで配列の場合は理解できたかと思いますが、逆に配列の要素を得るには数字しか使えない、ということをしっかり覚えておいてください。

次にハッシュの話になりますが、これはインデックスとして数字以外も使用可能です。
つまりハッシュは、何だろうと1つのものを別のものと関連づけられるということです。

ここではstuffというハッシュにおいて、数字の代わりに文字列を使って欲しいものを得ていることがわかると思います。
同様に文字列を用いて、ハッシュに要素を追加することもできます。
キーや変数に対する文字列に、制限はありません。
以下のようなことも可能です。

ここでは数字を使いましたが、1つのハッシュで数字と文字列の両方をキーとして用いることができるのが、上の画像を見てもわかると思います。
大抵何でも使えると、今のうちは覚えておいてください。

更にハッシュに要素を追加するだけでなく、消去することも勿論可能です。
deleteという関数を使って、以下のようにできます。

ハッシュの例

ここからは、エクササイズをやってみましょう。
以下のコードを書いて、その意味をしっかり理解してください。
ハッシュに要素を出し入れする場合と、その全ての操作に注目してください。
この例は、アメリカの州をその省略形にマッピングしており、そこから更にその週にある都市にマッピングしています。
ハッシュにおいて、マッピングとアソシエイティングと言葉は非常に大事なので、しっかり覚えておいてください。

出力結果について

以下のようになります。

ハッシュができることについて

ハッシュは配列のようなデータ構造の例であり、プログラミングでは最もよく使われているデータ構造の1つでもあります。
ハッシュは、溜めておきたいものとそれを得るのに必要なキーをマッピグしたりアソシエイティングするのに使われます。
ただこのままではわかりにくいので、プログラムではなく実際の世界で例を用いて見ていきましょう。

“Honorificabilitudinitatibus”という言葉が、何を意味するのか調べたいとします。
今日ではサーチエンジンを使い、コピペして素早く調べることができますが、その登場前は以下のような手順で調べていました。

  1. 図書館に行き、辞書を手に入れる。
  2. “honorificabilitudinitatibusというHから始まる言葉について調べるため、辞書の横の部分を見てHのタブを探す。
  3. そこからざっとページを読み流し、”hon”あたりが出てくるところまで進む。
  4. 更にもう少し読み進めて”honorificabilitudinitatibus”が出てくるところまでいく、あるいは”hp”の部分まできたらその言葉は辞書にないというのがわかります。
  5. 導入部分を見つけたら、言葉の意味を理解するためにその定義を読む。

このプロセスは、ハッシュの働きとよく似ており、基本的にマッピングというのは”honorificabilitudinitatibus”という言葉を、その定義と結びつけているだけです。
Rubyにおけるハッシュというのは、実際の世界における辞書のようなものなのです。

学習ドリル

  1. 上でやったようなエクササイズの内容を、自分の国あるいはその他の国でもやってみてください。
  2. ハッシュに関するRubyのドキュメントを読んで、もう少し色々やってみてください。
  3. ハッシュでできないことを、調べてみてください。のの中でも有名なのが、ハッシュは順番を持たないということです。

学習ドリルの答え

  1. 日本でやってみました。

2. http://ruby-doc.org/core-2.2.0/Hash.htmlに、ハッシュに関するドキュメントがありました。今回は、shiftというメソッドを使ってみました。これはハッシュから要素とキーを取り除くもので、取り除いたものを出力します。

3. ハッシュには前述の通り順番というものがないのですが、ソートすることは可能です。ハッシュにおけるソートメソッドは、キーのアルファベット順に要素を並べ替えます。

--

--