Map 是一種用來儲存鍵值對的資料結構。 它和其他程式語言裡的字典很像。 Map 介面定義了 Map 上的各種操作。
Java 有許多不同的 Map 實作。 HashMap 是其中最常用的一種。
// Make an instance
Map<String, Integer> fruitPrices = new HashMap<>();
使用 put 把項目加入 map。
fruitPrices.put("apple", 100);
fruitPrices.put("pear", 80);
// => { "apple" => 100, "pear" => 80 }
每個鍵只能對應一個值。
用相同的鍵呼叫 put 會更新該鍵的值。
fruitPrices.put("pear", 40);
// => { "apple" => 100, "pear" => 40 }
使用 get 取得某個鍵對應的值。
fruitPrices.get("apple"); // => 100
使用 containsKey 檢查 map 是否包含某個特定的鍵。
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 方法,分別以 Set 或集合的形式取得 Map 中的鍵或值。
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"}