現場で使用したMapの使い方メモ

#目次
[1.Mapの初期化編](#1-mapの初期化編)
[2.Mapに要素を追加する編](#2-mapに要素を追加する編)
[3.Mapから要素を取り出す編](#3-mapから要素を取り出す編)
[4.Mapの中身を確認する編](#4-mapの中身を確認する編)
[5.さいごに](#5-さいごに)

#1. Mapの初期化編

## ① Map<キーの型, 値の型> Map名 = new HashMap<>() で初期化
※型はクラス型のデータ型（String、Integer、Longなど）を指定する必要があるので注意。

```java
Map<Integer, String> fishNameMap = new HashMap<>();
```

<details><summary>キーと値が詰まっていくイメージはこちら。</summary><div>

| キー | 値 | 
| :-: | :-: | 
| 1 | かつお |
| 2 |　さんま　 |
| 3 | あじ |

</div></details>

##② Mapの値にはリストを設定することも可能

```java
Map<Integer, List<String>> fishNameMap = new HashMap<>();
```
<details><summary>キーと値が詰まっていくイメージはこちら。</summary><div>

| キー | 値 | 
| :-: | :-: | 
| 1 | かつお名前リスト |
| 2 |　さんま名前リスト　 |
| 3 | あじ名前リスト |

</div></details>

#2. Mapに要素を追加する編
##① Map名.put(キー, 値) で値を詰める
※重複するキーで値を追加すると上書きされるので注意。

```java
// Map初期化
Map<Integer, String> fishNameMap = new HashMap<>();

// 値を詰める
fishNameMap.put(1, "かつお");
fishNameMap.put(2, "さんま");
fishNameMap.put(3, "あじ");
```
<details><summary>fishNameMapの状態。</summary><div>

| キー | 値 | 
| :-: | :-: | 
| 1 | かつお |
| 2 |　さんま　 |
| 3 | あじ |

</div></details>

##② 値がリストの場合は下記の様に追加

```java
// Map初期化
Map<Integer, List<String>> fishNameMap = new HashMap<>();

// List初期化
List<String> katsuoNameList = new ArrayList<String>();
// Listに値を詰める
katsuoNameList.add("鰹");
katsuoNameList.add("カツオ");

// 値を詰める
fishNameMap.put(1, katsuoNameList);
```
<details><summary>fishNameMapの状態。</summary><div>

| キー | 値 | 
| :-: | :-: | 
| 1 | かつお名前リスト |

</div></details>

<details><summary>katsuoNameListの状態。</summary><div>

| かつお名前リスト|
| :-: | 
| 　鰹 　|  
| カツオ |  

</div></details>

<details><summary>さんま、あじの情報を追加したものはこちら。</summary><div>

```java
Map<Integer, List<String>> fishNameMap = new HashMap<>();

// かつお
List<String> katsuoInfoList = new ArrayList<String>();
katsuoInfoList.add("鰹");
katsuoInfoList.add("カツオ");

// さんま
List<String> sanmaInfoList = new ArrayList<String>();
sanmaInfoList.add("秋刀魚");
sanmaInfoList.add("サンマ");

// あじ
List<String> aziInfoList = new ArrayList<String>();
aziInfoList.add("鯵");
aziInfoList.add("アジ");

fishNameMap.put(1, katsuoInfoList);
fishNameMap.put(2, sanmaInfoList);
fishNameMap.put(3, aziInfoList);
```

| キー | 値 | 
| :-: | :-: | 
| 1 | かつお名前リスト |
| 2 |　さんま名前リスト　 |
| 3 |　あじ名前リスト　 |

</div></details>

[ページ上部へ戻る](#目次)

#3. Mapから要素を取り出す編
##① キーで値を取得
Map名.get(キー) で取得できる。
下記例では "かつお" が取得できる。

```java
Map<Integer, String> fishNameMap = new HashMap<>();
fishNameMap.put(1, "かつお");
fishNameMap.put(2, "さんま");
fishNameMap.put(3, "あじ");

// キーで値を取得
fishNameMap.get(1);
```

##② キーをすべて取得
Map名.keySet() で取得できる。
下記例では 1、2、3 が取得できる。

```java
Map<Integer, String> fishNameMap = new HashMap<>();
fishNameMap.put(1, "かつお");
fishNameMap.put(2, "さんま");
fishNameMap.put(3, "あじ");

// キーをすべて取得
fishNameMap.keySet();
```
上記で取得したすべてのキーを使用する方法の例。
Mapから取得したすべてのキーを、新たなリストに詰める。

```java
Map<Integer, String> fishNameMap = new HashMap<>();
fishNameMap.put(1, "かつお");
fishNameMap.put(2, "さんま");
fishNameMap.put(3, "あじ");

// 新たなリスト「キーリスト」を用意
List<String> keyList = new ArrayList<String>();

// 拡張for文でぐるぐる回して、取得したすべてのキーを取り出す。
for (Integer key : fishNameMap.keySet()) {
  keyList.add(key);
}
```

<details><summary>キーリストの状態。</summary><div>
| キーリスト|
| :-: | 
| 1 |  
| 2 |  
| 3 |  

</div></details>

##③ 値をすべて取得
Map名.values() で取得できる。
下記例では "かつお"、"さんま"、"あじ" が取得できる。

```java
Map<Integer, String> fishNameMap = new HashMap<>();
fishNameMap.put(1, "かつお");
fishNameMap.put(2, "さんま");
fishNameMap.put(3, "あじ");

// 値をすべて取得
fishNameMap.values();
```
上記で取得したすべての値を使用する方法の例。
Mapから取得したすべての値を、新たなリストに詰める。

```java
Map<Integer, String> fishNameMap = new HashMap<>();
fishNameMap.put(1, "かつお");
fishNameMap.put(2, "さんま");
fishNameMap.put(3, "あじ");

// 新たなリスト「値リスト」を用意
List<String> valueList = new ArrayList<String>();

// 拡張for文でぐるぐる回して、取得したすべての値を取り出す。
for (String value : fishNameMap.values()) {
  valueList.add(value);
}
```

<details><summary>値リストの状態。</summary><div>

| 値リスト|
| :-: | 
| かつお |  
| さんま |  
|  あじ |  

</div></details>
[ページ上部へ戻る](#目次)

##④ 値がリストの場合の値取得＆使用例
今回は、Mapからリストを取得し、そのリストの要素を新たなリストに詰める例です。

```java
//--------------------- Mapの作成 --------------------------
// Mapを用意
Map<Integer, List<String>> fishNameMap = new HashMap<>();

// Map設定用リストを用意
List<String> katsuoNameList = new ArrayList<String>();
katsuoNameList.add("鰹");
katsuoNameList.add("カツオ");

// 上記リストをMap追加
fishNameMap.put(1, katsuoNameList);

//------------------- 新たなリストの作成 ---------------------
// 新たなリストを用意。
List<String> newKatsuoNameList = new ArrayList<String>();

// キーでMapから値（リスト）を取得、それを新たなリストに詰める。
newKatsuoNameList.addAll(fishNameMap.get(1));
```
<details><summary>新たなリスト（newKatsuoNameList）の状態。</summary><div>

| newKatsuoNameList |
| :-: | 
| 鰹 |  
| カツオ |  

</div></details>

##⑤ キーと値のセットをすべて取得
Map名.entrySet() で取得できる。
エントリーとはMapのキーと値のペアのこと。

```java
Map<Integer, String> fishNameMap = new HashMap<>();
fishNameMap.put(1, "かつお");
fishNameMap.put(2, "さんま");
fishNameMap.put(3, "あじ");

// エントリー（キーと値のペア）をすべて取得
fishNameMap.entrySet();
```

上記で取得したすべてのエントリー（キーと値のセット）を使用する方法の例。
今回は拡張for文を使用してすべてのキーと値を取り出す方法を記載。

```java
Map<Integer, String> fishNameMap = new HashMap<>();
fishNameMap.put(1, "かつお");
fishNameMap.put(2, "さんま");
fishNameMap.put(3, "あじ");

// 拡張for文でぐるぐる回して、取得したエントリーからすべてのキーと値を取り出す。
for (Entry<Integer, String> mapEntry : fishNameMap.entrySet()) {
  // キーを取得
  String value = mapEntry.getKey();
  // 値を取得
  String value = mapEntry.getValue();
}
```
型はEntry<Mapの型>のように定義し、変数名はエントリーだということを明示するのが望ましい。
エントリーからのキーの取得は、mapEntry.getKey();
値の取得は、mapEntry.getValue();　で取得できる。

[ページ上部へ戻る](#目次)

#4. Mapの中身を確認する編
##① 指定したキーの存在確認
Map名.containsKey(検索したいキー) で確認できる。
存在する場合はtrueが、存在しない場合はfalseが返る。
そのため下記例ではtrueが返る。

```java
Map<Integer, String> fishNameMap = new HashMap<>();
fishNameMap.put(1, "かつお");
fishNameMap.put(2, "さんま");
fishNameMap.put(3, "あじ");

// 指定したキーの存在確認
fishNameMap.containsKey(2);
```

##② 指定した値の存在確認
Map名.containsKey(検索したいキー) で確認できる。
存在する場合はtrueが、存在しない場合はfalseが返る。
そのため下記例でもtrueが返る。

```java
Map<Integer, String> fishNameMap = new HashMap<>();
fishNameMap.put(1, "かつお");
fishNameMap.put(2, "さんま");
fishNameMap.put(3, "あじ");

// 指定した値の存在確認
fishNameMap.containsValue("あじ");
```

[ページ上部へ戻る](#目次)

#5. さいごに
ここまで読んでいただきありがとうございます！
現場で実装を行っていた際にMapの理解が不足していると感じたため、
主に現場で使用したMapの使い方を今回まとめてみました。
自分の記録が誰かのお役に立てると嬉しいです。。