Map是一种用于存储键值对的数据结构。 它类似于其他编程语言中的字典。 Map接口定义了映射上的各种操作。
Java 有多种不同的 Map 实现。 HashMap是常用的一种。
// Make an instance
Map<String, Integer> fruitPrices = new HashMap<>();
用put向映射中添加条目。
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检查映射中是否包含某个特定的键。
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"}