Map集合的特性:一个key值对应一个value值,key值保持着唯一性,而插入的键值对相同key值会发生覆盖原key值对应的value值。
Map集合中一个key对应一个value,但是一个相同的value值可以对应多个key值
下面我们来根据value获取key,根据key获取value(1.foreach循环遍历 2.迭代器遍历)
举一个例子会更生动!
题目
创建一个Map集合,在集合中放入年份、世界杯冠军获得的国家。存储的键值对例如:“1994”,“巴西”;“1962”,“巴西”;(key存储年份,value存储国家球队)
1、从命令行中读入一个字符串,表示年份,输出该年的世界杯冠军是哪个国家球队。如果该年没有举办世界杯,则输出:没有举办世界杯【根据key获取对应value】
2、读入一个国家名字,输出该球队夺冠的年份列表,如果该国家没有获得过世界杯冠军或没有参加过世界杯,则输出:没有获得过世界杯【根据相同value获取多个key】
注意:这里我强调一下,虽然在写Set对象接收map.entrySet()方法中的键值对的时候可以省略泛型,但是我不建议省略,个人感觉要遵循编码规范,养成良好的编码习惯!(虽然有时候感觉没有用,但我相信你会从中受益的!)
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
/**
* @author Ziph
* @date 2020年3月6日
* @Email [email protected]
*/
public class TestGetkeys {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//将年份和国家存储在Map集合中(这里我就简单的放了几组键值对,用的String类型)
Map<String, String> map = new HashMap<String, String>();
map.put("1930", "乌拉圭");
map.put("1938", "意大利");
map.put("1934", "意大利");
map.put("1950", "乌拉圭");
map.put("1974", "德国");
map.put("1970", "巴西");
map.put("1978", "阿根廷");
//解决第一问:根据key值获取对应value值
System.out.print("请输入您要查询世界杯冠军的年份:");
String date = sc.nextLine();
if (map.get(date) != null) {
System.out.println(map.get(date));
} else {
System.out.println("没有举办世界杯");
}
//解决第二问:根据相同value获取多个key
System.out.print("请输入一个您要查找得世界杯冠军的国家:");
String country = sc.nextLine();
//entrySet()方法把map中的每个键值对变成对应成Set集合中的一个对象
Set<Entry<String, String>> set = map.entrySet();
//因为循环获取多个满足相同value值得key值
//如果没有获得过世界杯的国家则会打印循环次数的行数,而return结束函数也会随之出现问题
//我这里用的flag标记,来实现功能
boolean flag = false;
for (Entry<String, String> e : set) {
if (e.getValue().equals(country)) {
System.out.print(e.getKey() + "年 ");
flag = true;
}
}
if (flag == false) {
System.out.println("没有获得过世界杯");
return;
}
}
}
迭代器遍历
Set<Entry<String, String>> set = map.entrySet();
Iterator<Entry<String, String>> it = set.iterator();
while (it.hasNext()) {
Map.Entry<String, String> e = (Map.Entry<String, String>) it.next();
if (e.getValue().equals(country)) {
System.out.print(e.getKey() + "年 ");
}
}