Java练习——Map集合
第一题
1、从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。
2、在原有世界杯Map 的基础上,增加如下功能: 读入一支球队的名字,输出该球队夺冠的年份列表。 例如,读入“巴西”,应当输出 1958 1962 1970 1994 2002 读入“荷兰”,应当输出 没有获得过世界杯
思路分析
- 通过System.out.println提示用户输入年份或国家。
- 使用input.nextInt()或input.next()读取用户输入。
- 使用map.containsKey(year)来检查年份是否存在于Map中。
- 如果存在,输出该年的世界杯冠军;否则,输出“没有举办世界杯”。
- 对于第二个功能,使用map.containsValue(country)来检查输入的国家是否是某个世界杯的冠军。
- 如果存在,输出该国家的夺冠年份列表;否则,输出“没有获得过冠军”。
完整代码
package Test1;
import java.util.HashMap;
import java.util.Scanner;
/*
历届世界杯冠军
* */
public class WorldCupEntity {
public static void main(String[] args) {
// 创建一个Scanner对象,用于从命令行读取用户输入
Scanner input = new Scanner(System.in);
// 创建一个HashMap对象,用于存储每个世界杯的年份和冠军信息
HashMap map = new HashMap();
map.put(1930, "乌拉圭");
map.put(1934, "意大利");
map.put(1938, "意大利");
map.put(1950, "乌拉圭");
map.put(1954, "西德");
map.put(1958, "巴西");
map.put(1962, "巴西");
map.put(1966, "英格兰");
map.put(1970, "巴西");
map.put(1974, "西德");
map.put(1978, "阿根廷");
map.put(1982, "意大利");
map.put(1986, "阿根廷");
map.put(1990, "西德");
map.put(1994, "巴西");
map.put(1998, "法国");
map.put(2002, "巴西");
map.put(2006, "意大利");
map.put(2010, "西班牙");
map.put(2014, "德国");
map.put(2018, "法国");
//从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。
//如果该年没有举办世界杯,则输出:没有举办世界杯。
System.out.println("请输入年份:");
int year = input.nextInt();
//判断HashMap中是否包含该年份作为键的值:如果包含则说明该年份举办了世界杯,输出该年的世界杯冠军;否则输出没有举办世界杯
if (map.containsKey(year)) {
System.out.println(year + "年的世界杯冠军是" + map.get(year));
} else {
System.out.println("没有举办世界杯");
}
//读入一支球队的名字,输出该球队夺冠的年份列表。 例如,读入“巴西”,应当输出 1958 1962 1970 1994 2002
//读入“荷兰”,应当输出 没有获得过世界杯
System.out.println("请输入国家:");
String country = input.next();
//如果HashMap中包含该球队名字作为值的元素,则输出该球队的夺冠年份列表;否则输出该球队没有获得过冠军的信息。
if (map.containsValue(country)) {
System.out.println(country + "夺冠年份是:");
for (Object y : map.keySet()) {
if (map.get(y).equals(country)) {
System.out.print(y + "\t");
}
}
} else {
System.out.println(country + "没有获得过冠军");
}
}
}
运行结果
第二题
使用Map完成如下功能:
在控制台输入一串字符串,统计字符串中每个字符出现的次数,并按照次数的降序进行排序
存放: 某个字符,以及该字符出现的次数
Key: 字符
Value: 次数
思路分析
- 输入字符串:程序提示用户输入一串字符串,然后使用Scanner类读取用户输入的字符串。
- 转换为字符数组:程序将用户输入的字符串转换为字符数组,这样可以通过遍历数组来处理每个字符。
- 初始化Map:使用一个HashMap来存储每个字符及其出现的次数。
- 遍历字符数组并计数:遍历字符数组,对每个字符进行判断。如果该字符已经在Map中(即该字符已经出现过),则将该字符的计数加1;如果该字符不在Map中,则在Map中添加该字符,并将计数设为1。
- 输出结果:程序使用一个Iterator遍历Map的entrySet,输出每个字符及其出现的次数。
- 降序排序:程序创建一个新的列表,包含Map的entrySet,然后使用Collections.sort方法按照出现次数进行降序排序。排序时使用了一个自定义的比较器(Comparator),该比较器比较两个Map.Entry对象的值(即字符出现的次数)。
- 输出排序后的结果:程序再次使用Iterator遍历排序后的列表,并输出每个字符及其出现的次数。
完整代码
package Test2;
import java.util.*;
public class TreMap {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入一串字符串:");
String str = input.next();
// 将字符串转换为字符数组
char [] chars = str.toCharArray();
// 使用Map,用于存储字符及出现的次数
Map<Character,Integer> map = new HashMap<>();
// 遍历字符数组
for (char c : chars){
// 如果字符存在
if (map.containsKey(c)){
//定义变量存储字符出现的次数
Integer value = map.get(c);
// 次数加1
value++;
// 更新value的值,添加新的字符,次数为1
map.put(c,value);
}else {//若字符不存在,
map.put(c,1);
}
}
// 获取Map的所有键值对
Set<Map.Entry<Character, Integer>> entrySet = map.entrySet();
// 获取迭代器,用于遍历键值对集合
Iterator<Map.Entry<Character, Integer>> iterator = entrySet.iterator();
// 判断是否还有下一个键值对
while (iterator.hasNext()) {
// 获取下一个键值对
Map.Entry<Character, Integer> entry = iterator.next();
Character key = entry.getKey();
Integer value = entry.getValue();
System.out.println("字符\"" + key + "\"的次数为:" + value);
}
System.out.println("----------------------------------");
//将次数进行降序排列
System.out.println("降序排列后:");
// 创建一个新的列表,列表元素是map的键值对
List<Map.Entry<Character,Integer>> list = new ArrayList<>(map.entrySet());
// 使用Collections.sort方法对列表进行排序,排序规则由下面的Comparator对象定义
// Comparator是一个接口,它定义了一个名为compare的方法,该方法用来比较对象的大小
Collections.sort(list, new Comparator<Map.Entry<Character, Integer>>() {
@Override
// 这里定义了compare方法,该方法接收两个参数,分别是两个Map.Entry对象
public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) {
// 比较两个Map.Entry对象的值(Integer类型),返回结果是o2与o1值的比较结果
// 值较大的Map.Entry对象会被放在后面,从而实现降序排序
return o2.getValue().compareTo(o1.getValue());
}
});
// 遍历排序后的列表
for (Map.Entry<Character,Integer> entry : list){
Character key = entry.getKey();
Integer value = entry.getValue();
System.out.println("字符\"" + key + "\"的次数为:" + value);
}
}
}
运行结果
第三题
(Map)设计Account 对象如下:
private long id;
private double balance;
private String password;
要求完善设计,使得该Account 对象能够自动分配id。 给定一个List 如下:
List list = new ArrayList();
list.add(new Account(10.00, “1234”));
list.add(new Account(15.00, “5678”));
list.add(new Account(0, “1010”));
要求把List 中的内容放到一个Map 中,该Map 的键为id,值为相应的Account 对象。 最后遍历这个Map,打印所有Account 对象的id 和余额。
思路分析
- 创建账户列表:首先,创建了一个ArrayList对象,并向其中添加了三个Account对象,每个对象代表一个账户,包含一个余额(double类型)和一个账号(String类型)。
- 创建账户映射:然后,创建了一个HashMap对象,并将ArrayList中的Account对象作为值,与一个整数(1、2、3)作为键进行映射。这样,我们可以通过这个整数键快速找到对应的Account对象。
- 遍历映射:通过entrySet()方法获取HashMap的键值对集合,然后使用Iterator遍历这个集合。在每次迭代中,我们获取当前的键值对,其中键是整数值(1、2、3),值是Account对象。然后,我们将键和值分别打印出来。
完整代码
Account:
package Test4;
public class Account {
private long id;
private double balance;
private String password;
public Account(int i, String s) {
}
public Account(double balance, String password) {
this.balance = balance;
this.password = password;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString(){
return getBalance()+" ";
}
}
AccountTest:
package Test4;
import java.util.*;
public class AccountTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add(new Account(10.00, "1234"));
list.add(new Account(15.00, "5678"));
list.add(new Account(0.00,"1010"));
Map map = new HashMap<>();
map.put(1,list.get(0));
map.put(2,list.get(1));
map.put(3,list.get(2));
Set<Map.Entry<Integer, Account>> entrySet = map.entrySet();
// 获取迭代器,用于遍历键值对集合
Iterator<Map.Entry<Integer, Account>> iterator = entrySet.iterator();
// 判断是否还有下一个键值对
while (iterator.hasNext()) {
// 获取当前的键值对
Map.Entry<Integer, Account> entry = iterator.next();
Integer key = entry.getKey();
Account value = entry.getValue();
System.out.println("ID:" + key + "\t余额:" + value);
}
}
}
运行结果
第四题
(Map)已知某学校的教学课程内容安排如下:
完成下列要求:
1) 使用一个Map,以老师的名字作为键,以老师教授的课程名作为值,表示上述课程安排。
2) 增加了一位新老师Allen 教JDBC
3) Lucy 改为教CoreJava
4) 遍历Map,输出所有的老师及老师教授的课程(Set<Map.Entry<String,String>>、Set get(key))
5) 利用Map,输出所有教JSP 的老师。
思路分析
- 创建教师与课程的映射:首先,创建了一个HashMap对象,用于存储教师与他们所教授的课程之间的映射关系。键是教师的名字(String类型),值是教师所教授的课程名(String类型)。
- 添加和修改映射关系:代码中先向映射中添加了几个教师和他们的课程,然后通过map.put()方法修改了Lucy教师所教授的课程,并增加了一位新教师Allen。
- 遍历并输出映射关系:使用迭代器遍历整个映射,并使用System.out.println()方法输出每个教师的名字和他们所教授的课程。
- 筛选教特定课程的教师:使用for-each循环遍历所有的键(即所有的教师名字),然后通过map.get(k).equals(“JSP”)判断该教师是否教授JSP课程。如果是,就输出该教师的名字。
完整代码
package Test5;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class TeacherEntity {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
//使用一个Map,以老师的名字作为键,以老师教授的课程名作为值,表示上述课程安排。
map.put("Lucy", "C++");
map.put("Cindy", "JSP");
map.put("Amy", "CoreJava");
map.put("Tom", "JSP");
map.put("windy", "HTML");
map.put("Kevin", "JSP");
//增加了一位新老师Allen 教JDBC
map.put("Allen", "JDBC");
//Lucy 改为教CoreJava
map.put("Lucy", "CoreJava");
//遍历Map,输出所有的老师及老师教授的课程
// 获取Map的所有键值对
Set<Map.Entry<String, String>> entrySet = map.entrySet();
// 获取迭代器,用于遍历键值对集合
Iterator<Map.Entry<String, String>> iterator = entrySet.iterator();
// 判断是否还有下一个键值对
while (iterator.hasNext()) {
// 获取当前的键值对
Map.Entry<String, String> entry = iterator.next();
String key = entry.getKey();
String value = entry.getValue();
System.out.println("老师姓名:" + key + "\t\t老师所教授的课程:" + value);
}
//利用Map,输出所有教JSP 的老师
System.out.println("-------------------------------------");
System.out.println("教JSP 的老师有:");
// 遍历Map的所有键,即所有老师的名字
for (String k : map.keySet()) {
// 判断指定老师是否教授JSP课程,如果是,输出该老师的名字
if (map.get(k).equals("JSP")) {
System.out.println(k);
}
}
}
}
运行结果
总结
- Map通过键-值(key-value)对的形式来存储数据
- Map的实现:HashMap(使用频率最高的),TreeMap,HashTable
- Map中,key可以为任意类型,但这里建议使用String,value也可以是任意类型
- Map里面多个value可以是不同类型
- Map里面key是可以重复的,当key重复时,后存入的数据会覆盖前面的数据
- Map里面,value可以重复.
- Map里面的key可以为null,但是只能有一个,多个的时候,后面的会覆盖前面的
- Map中value可以是null,多个value可以同时为null。
- Map中的key在底层可以理解为是一个Set