辞書を作る: Mapの利用
Mapとは
- 「キー」と「値」をペアで扱うコレクション(Listは値だけを扱う)
- キーはユニーク(unique、唯一の)になる。同じキーで違う値は登録できない。
- キーと値を保存するにはputメソッドを使う。
- キーで検索して値を取り出すにはgetメソッドを使う。
- Mapはインターフェース。Mapを実装したクラスとしてはHashMapがよく使われる。
- 教科書P.215〜227
Mapを利用する例として、次の機能を持つ辞書アプリを作ってみよう。
- 英語をキー、日本語を値として登録できる。
- 英語から日本語を検索できる。
- 登録されたデータ一覧を見ることができる。
登録
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"/> <title>辞書</title> </head> <body> <h2>登録</h2> <p th:if="${message != null}" th:text="${message}">メッセージ</p> <form method="post"> 英語: <input name="english" /><br /> 日本語: <input name="japanese" /><br /> <button type="submit">登録</button> </form> <hr /> <a href="search">検索</a> <a href="list">一覧</a> </body> </html> |
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
/** * 辞書情報を保存するフィールド */ private Map<String, String> dictionary = new HashMap<>(); /** * 辞書(登録): get */ @GetMapping("/dictionary/register") public String dictionaryRegister() { return "lecture06/dictionaryRegister"; } /** * 辞書(登録): post */ @PostMapping("/dictionary/register") public String dictionaryRegister(ModelMap modelMap, @RequestParam("english") String english, @RequestParam("japanese") String japanese) { dictionary.put(english, japanese); modelMap.addAttribute("message", "「" + english + "/" + japanese + "」を登録しました。"); return "lecture06/dictionaryRegister"; } |
- コントローラ、22行目: 辞書の情報を格納するHashSetをフィールドとして定義する。
- コントローラ、37行目: putメソッドでMapに登録する。
検索
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"/> <title>辞書</title> </head> <body> <h2>検索</h2> <p th:if="${result != null}" th:text="${result}">検索結果</p> <form method="post"> 英語: <input name="english" /><br /> <button type="submit">検索</button> </form> <hr /> <a href="register">登録</a> <a href="list">一覧</a> </body> </html> |
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
/** * 辞書(検索): get */ @GetMapping("/dictionary/search") public String dictionarySearch() { return "lecture06/dictionarySearch"; } /** * 辞書(検索): post */ @PostMapping("/dictionary/search") public String dictionarySearch(ModelMap modelMap, @RequestParam("english") String english) { String japanese = dictionary.get(english); String result; if (japanese != null) { result = "「" + english + "」の検索結果は「" + japanese + "」です。"; } else { result = "「" + english + "」は登録されていません。"; } modelMap.addAttribute("result", result); return "lecture06/dictionarySearch"; } |
- コントローラ、55行目: getメソッドでキーから値を得る。登録されていない場合はnullが返ってくる。
一覧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"/> <title>辞書</title> <style> table { border-collapse: collapse; } th, td { border: 1px solid black; } </style> </head> <body> <h2>一覧</h2> <table> <tr> <th>英語</th> <th>日本語</th> </tr> <tr th:each="english:${dictionary.keySet()}"> <td th:text="${english}">英語</td> <td th:text="${dictionary.get(english)}">日本語</td> </tr> </table> <hr /> <a href="register">登録</a> <a href="search">検索</a> </body> </html> |
66 67 68 69 70 71 72 73 |
/** * 辞書(一覧) */ @GetMapping("/dictionary/list") public String dictionaryList(ModelMap modelMap) { modelMap.addAttribute("dictionary", dictionary); return "lecture06/dictionaryList"; } |
- テンプレート、24行目: keySetメソッドでキーのSetを取得する。Setについては教科書P.205〜214を参照。
- テンプレート、26行目: getメソッドでキーから値を得る。
資料
- ソースコード
- オンラインドキュメント
- 教科書
-
- Map: P.215〜227
- Set: P.205〜214