絶対にわかるHashMap

やあ諸君！
今日も元気にジャバジャバしていこうな．

ちなみに今回はJavaのHashMapを軸に話をしているが
C++，PHP，Ruby，JavaScript，．．．
とかその他の言語にも同じようなものはあるし，
「連想配列」，単に「ハッシュ」，単に「マップ」，キーバリューなんちゃらら，．．．
などと呼ばれたり，その概念は広く使われているものだ．
これからの人生，プログラミングをすることが多いようならこの記事を読んでおいて損ではないだろう．


# Overview
今回は最終的にHashMapについて理解してもらうのが目的だが，これを達成するにはいくつかの前提知識が必要だ．

まず「配列」について知っておく必要があるだろう．
もし君がCやJavaにある程度触れたことがあるというのなら，既に知っているはずだ．
今回は改めて配列について説明をしておくぞ．

次に「連想配列」について触れるぞ．
連想配列とはその名の通り配列の仲間であり，HashMapの概念そのものである．

最後に実際の「HashMap」についてだ．
つまり，Javaで実際にどうやって連想配列を使うのか，ということだな．



# 配列とは何か？
配列というものをご存知かね？
知らないようであっても，今から言うことを聞いてくれれば，おおまかに理解できるはずだ．

配列を使おうとするなら，こう書くだろう．

```java:Java
int[] arr = new int[3];
```

もしくはC言語なら

```c:C
int arr[3];
```

これは，int型で長さが3の配列を作り，それに「arr」という名前をつけている．

その後，

```java
arr[0] = 100;
arr[1] = 125;
arr[2] = 150;
```

それぞれint型の変数を入れて・・・

```java
System.out.println(arr[1]); //=> 125
```

取り出す．

ところで今，我々は何をしたのだろうか？
簡単に言うとこうだ．

int型が3つ収納できる箱を用意して，
「0番目」が「100」
「1番目」が「125」
「2番目」が「150」
と設定した．
次に，この箱に「1番目は何ですか？」と尋ねると，「125です」と答えが返ってきた．

このとき，もし「0番目」を尋ねたら「100」，「2番目」を尋ねたら「150」と返ってくるだろう．


つまり配列というのは，「番号」を目印にして何かを記録するために使われるわけだ．
ちなみに，配列はふつう，0番目から始めて，0，1，2，3，4，...というように番号をつける．
ということは，何かの「順序」を覚えておくのにも使えるということだな．
最初が100で，次が125，最後は150．
for文と組み合わせてヒジョーに効率的なプログラムを書いたりできる．
非常に便利だな．便利だ．


# 連想配列とは何か？
配列が便利なのはわかった．
しかし，こういう風に考えたことはないだろうか？

『番号以外を目印にできないの？』
『目印に数字しか使えないのが不便・・・』

既に気付いている人もいるだろう．
そう，「数字以外を目印にできる配列」こそが「連想配列」なのだ．

『えーっ！そんな便利なものがあるの！？』

フハハ，我々を甘く見てもらっては困るぞ．
世界はもうこんなに便利な時代へと突入しているのだ！

・・・えー，コホン．

では実際に，数字の代わりとして「文字列」で連想配列を使ってみよう．
実際のJavaではこんなことはできないが，考え方としてはこうだ．

```java:Javaのような言語
arr["apple"] = 100;
arr["banana"] = 125;
arr["chocolate"] = 150;

System.out.println(arr["banana"]); //=> 125
```

『バナナはいくらですか？』
『125円です！』

素晴らしい．Marvelous！


# 実践HashMap

では実際にJavaで連想配列を使うにはどうするのか？
その答えが「HashMap」だ．

ところで今日からお店を開こうと思うんだが，どうだろうか．

```java:開店の準備
HashMap<String, Integer> shop = new HashMap<String, Integer>();
```

ちなみに `<String, Integer>` というのは，Stringを目印にしてIntegerを記録すると言う意味だ．
今回は `apple` `banana` `chocolate` を目印にして，それぞれの値段を記録しよう．
では実際に，このお店に商品を並べて値段を書いていくぞ．

```java:商品の陳列
shop.put("apple", 100);
shop.put("banana", 125);
shop.put("chocolate", 150);
```

では早速開店だ！

```java:いらっしゃいませ！
System.out.println(shop.get("banana")); //=> 125
```

『バナナはいくらですか？』
『125円です！』

```java
System.out.println(shop.get("chocolate")); //=> 150
```

『チョコレートはいくらですか？』
『150円です！』

```java
System.out.println(shop.get("coffee")); //=> null
```

『コーヒーはいくらですか？』
『コーヒーは置いてないんです・・・』

お客さん，結局何も買わずに帰ってしまった・・・

# 続・実践HashMap

もうちょっとだけ続くんじゃ．

例えばこんなclassを用意してみようか．

```java
class Item {
  private int price;
  private String from;

  public Item(int price, String from) {
    this.price = price;
    this.from = from;
  }
  public int getPrice() {
    return price;
  }
  public String getFrom() {
    return from;
  }
}
```

priceは値段，fromは産地をあらわす．

これでお店を開いてみよう．

```java:開店の準備
HashMap<String, Item> shop = new HashMap<String, Item>();
```

Stringを目印にしてItemを記録するという意味だ．
100円で日本産のItemを作るには， `new Item(100, "Japan");` とするから，

```java:商品の陳列
shop.put("apple", new Item(100, "Japan"));
shop.put("banana", new Item(125, "India"));
shop.put("chocolate", new Item(150, "Ghana"));
```

というように陳列するわけだな．

```java:いらっしゃいませ！
System.out.println(shop.get("banana").getPrice()); //=> 125
System.out.println(shop.get("banana").getFrom()); //=> India
```

『バナナの値段は？』
『125円です！』
『バナナの産地は？』
『インドです！』

# Afterword
ということで諸君，HashMapは理解できただろうか？
HashMap，連想配列はとても便利な概念だ．
これを上手に使って友達に自慢しよう！

HashMapだけではない，Javaにはもっと便利なものがたくさんある．
グーグル先生を使っていろいろ調べてみるといいぞ！

今日はこれで終わり．
さらばだ諸君，また会おう！