Map**Map**は、キーと値のペアを保存するためのデータ構造です。他のプログラミング言語の辞書に似ています。Mapインターフェースは、Mapに対する操作を定義しています。
Javaには、さまざまなMapの実装があります。HashMapは、よく使われる実装の1つです。
// Make an instance
Map<String, Integer> fruitPrices = new HashMap<>();
Mapに要素を追加するには、putを使います。
fruitPrices.put("apple", 100);
fruitPrices.put("pear", 80);
// => { "apple" => 100, "pear" => 80 }
1つのキーに関連付けられる値は1つだけです。同じキーでputを呼び出すと、そのキーの値が更新されます。
fruitPrices.put("pear", 40);
// => { "apple" => 100, "pear" => 40 }
キーの値を取得するには、getを使います。
fruitPrices.get("apple"); // => 100
特定のキーがMapに含まれているかどうかを確認するには、containsKeyを使います。
fruitPrices.containsKey("apple"); // => true
fruitPrices.containsKey("orange"); // => false
要素を削除するには、removeを使います。
fruitPrices.put("plum", 90); // Add plum to map
fruitPrices.remove("plum"); // Removes plum from map
sizeメソッドは、要素の数を返します。
fruitPrices.size(); // Returns 2
keySetメソッドやvaluesメソッドを使うと、Mapのキーや値を、それぞれSetやコレクションとして取得できます。
fruitPrices.keySet(); // Returns "apple" and "pear" in a set
fruitPrices.values(); // Returns 100 and 80, in a Collection
この演習では、Mapを使って国際電話の国番号の辞書を管理するコードを書きます。
この辞書を使うと、国際電話の国番号(マップのキーで、Integer)から国名(マップの値で、String)を調べることができます。
仮引数を取らず、現在辞書に入っている国番号から国へのマップを返すgetCodesメソッドを実装します。
DialingCodes dialingCodes = new DialingCodes();
dialingCodes.getCodes();
// => empty map
辞書にデータを入れる必要があります。
国番号と対応する国を受け取り、その国番号と国を追加するsetDialingCodeメソッドを実装します。
国番号がすでにマップにある場合は、渡された国番号と国でマップを更新します。
DialingCodes dialingCodes = new DialingCodes();
dialingCodes.setDialingCode(679, "Unknown");
// => { 679 => "Unknown" }
dialingCodes.setDialingCode(679, "Fiji");
// => { 679 => "Fiji" }
国番号を受け取り、その国番号に対応する国名を返すgetCountryメソッドを実装します。
DialingCodes dialingCodes = new DialingCodes();
dialingCodes.setDialingCode(55, "Brazil");
dialingCodes.getCountry(55);
// => "Brazil"
国番号を追加するときは、国番号や国が二重に追加されないように注意する必要があります。
そのような状況では、最初のエントリーが正しいエントリーだとみなすことができます。
指定された国番号と国のエントリーを追加するaddNewDialingCodeメソッドを実装します。
ただし、setDialingCodeとは違い、国番号または国がすでにマップにある場合は何もしません。
DialingCodes dialingCodes = new DialingCodes();
dialingCodes.addNewDialingCode(32, "Belgium");
dialingCodes.addNewDialingCode(379, "Vatican City");
// => { 32 => "Belgium", 379 => "Vatican City" }
dialingCodes.addNewDialingCode(32, "Other");
dialingCodes.addNewDialingCode(39, "Vatican City");
// => { 32 => "Belgium", 379 => "Vatican City" }
珍しいことですが、間違いは起こりえます。
間違いを訂正するには、その国が現在どの国番号にマッピングされているかを知る必要があります。
どの国番号を訂正する必要があるかを見つけるために、国を受け取ってその国の国番号を返すfindDialingCodeメソッドを実装します。
その国がマップに_ない_場合はnullを返します。
DialingCodes dialingCodes = new DialingCodes();
dialingCodes.addDialingCode(44, "UK");
dialingCodes.findDialingCode("UK");
// => 44
dialingCodes.findDialingCode("Unlisted");
// => null
訂正すべき国番号がわかったので、次はそのコードを更新します。
その国の新しい国番号と国名を受け取り、それに合わせて更新するupdateCountryDialingCodeメソッドを実装します。
その国がマップに_ない_場合は何もしません(このメソッドは間違いの訂正を助けるためだけのものだからです)。
DialingCodes dialingCodes = new DialingCodes();
dialingCodes.addDialingCode(88, "Japan");
// => { 88 => "Japan" }
dialingCodes.updateCountryDialingCode(81, "Japan");
// => { 81 => "Japan" }
dialingCodes.updateCountryDialingCode(32, "Mars");
// => { 81 => "Japan"}