Java Map和Set集合应用
一、统计字符串中字符出现的频率(忽略大小写)
需求: 1. 从控制台读取一个字符串(可能包含字母、数字、符号和空格)。 2. 统计每个字母(a-z)出现的次数,不区分大小写(例如 'A' 和 'a' 视为同一个字符)。 3. 排除非字母字符(如数字、符号、空格等)。 4. 将统计结果按字母顺序升序排列,并输出每个字符及其出现次数(格式如 a:3)。 输入:输出:
代码:
public class CharacterFrequencyCounter2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一串字符串:");
String input = scanner.nextLine();
// scanner.close();
// 使用TreeMap来按键的自然顺序(字母顺序)排序
Map<Character, Integer> frequencyMap = new TreeMap<>();
// 统计每个字母字符的出现次数,忽略大小写
// 遍历字符串中的每个字符,如果是字母则统计其出现次数
for (char c : input.toCharArray()) {
// 将字符转换为小写,以便忽略大小写差异
char lowerC = Character.toLowerCase(c);
// 检查字符是否为字母,如果是则统计其出现次数
if (Character.isLetter(lowerC)) {
// 使用TreeMap来按键的自然顺序(字母顺序)排序,并统计出现次数
frequencyMap.put(lowerC, frequencyMap.getOrDefault(lowerC, 0) + 1);
}
}
// 输出结果
System.out.println("字符及其出现次数(按字母顺序升序):");
for (Map.Entry<Character, Integer> entry : frequencyMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
说明:getOrDefault()方法
getOrDefault 是 Java 中 Map 接口的一种方法,用于从映射中获取指定键的值。如果该键存在于映射中,则返回对应的值;如果该键不存在,则返回一个默认值。
源码
如下:
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
// 获取存在的键的值
int valueA = map.getOrDefault("A", 0); // 返回 1
System.out.println("Value for key 'A': " + valueA);
// 获取不存在的键的值,返回默认值
int valueC = map.getOrDefault("C", 0); // 返回 0
System.out.println("Value for key 'C': " + valueC);
二、 实现奥运会举办信息
需求:
1、定义数据结构:使用一个Map来存储年份和城市的映射关系。 2、读取年份并查询城市:输入年份,查询对应的举办城市,并输出结果。 3、读取城市并查询年份列表:输入城市名,查询该城市举办奥运会的所有年份,并输出结果。
代码:
public class OlympicInfo {
// map存储奥运会举办年份和城市信息
private Map<String, String> olympicCityMap = new HashMap<>();
// 初始化奥运会举办信息
public OlympicInfo() {
olympicCityMap.put("1896", "雅典");
olympicCityMap.put("1900", "巴黎");
olympicCityMap.put("1904", "圣路易斯");
olympicCityMap.put("1908", "伦敦");
olympicCityMap.put("1912", "斯德哥尔摩");
olympicCityMap.put("1920", "北京");
olympicCityMap.put("2000", "悉尼");
olympicCityMap.put("2004", "雅典");
olympicCityMap.put("2008", "北京");
olympicCityMap.put("2012", "伦敦");
olympicCityMap.put("2016", "里约热内卢");
olympicCityMap.put("2020", "东京");
olympicCityMap.put("2024", "巴黎");
// 继续添加其他年份和举办城市
}
// 根据年份查询举办城市
public String getCityByYear(String year) {
return olympicCityMap.get(year);
}
// 根据城市名查询举办年份列表
public Set<String> getYearsByCity(String city) {
return olympicCityMap.entrySet().stream()
.filter(entry -> entry.getValue().equals(city))
.map(Map.Entry::getKey)
.collect(Collectors.toSet());
}
// 菜单功能
public void interactWithUser() {
Scanner scanner = new Scanner(System.in);
boolean continueInteraction = true;
while (continueInteraction) {
System.out.println("请选择操作:");
System.out.println("1. 输入年份查询奥运会举办城市");
System.out.println("2. 输入城市名查询举办奥运会的年份列表");
System.out.println("3. 退出");
int choice = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
switch (choice) {
case 1:
System.out.print("请输入年份:");
String year = scanner.nextLine();
String city = getCityByYear(year);
if (city != null) {
System.out.println("该年的奥运会举办城市是:" + city);
} else {
System.out.println("没有举办奥运会");
}
break;
case 2:
System.out.print("请输入城市名:");
String cityName = scanner.nextLine();
Set<String> years = getYearsByCity(cityName);
if (!years.isEmpty()) {
System.out.println(cityName + "举办奥运会的年份列表:" + String.join(" ", years));
} else {
System.out.println(cityName + "没有举办过奥运会");
}
break;
case 3:
continueInteraction = false;
System.out.println("退出程序");
break;
default:
System.out.println("无效的选择,请重新输入");
}
}
scanner.close();
}
public static void main(String[] args) {
OlympicInfo olympicInfo = new OlympicInfo();
olympicInfo.interactWithUser();
}
}
说明:从 olympicCityMap
中查找所有与给定城市名 city
相关的年份,并将这些年份以 Set
的形式返回。使用 Set
的好处是可以自动去重,确保每个年份只出现一次。
代码分解
获取
olympicCityMap.entrySet()
:olympicCityMap
中所有的键值对(Map.Entry
对象)的集合。将集合转换为一个流(Stream),以便可以使用流操作(如过滤、映射等)
.stream()
:.filter(entry -> entry.getValue().equals(city))
:使用filter
方法来筛选流中的元素。这里的entry
是Map.Entry
对象,entry.getValue()
返回与该条目关联的城市名。只有当城市名与给定的city
变量相等时,该条目才会被保留在流中。使用
.map(Map.Entry::getKey)
:map
方法将流中的每个Map.Entry
对象转换为其键(年份)。Map.Entry::getKey
是方法引用,表示调用getKey()
方法。将流中的元素收集到一个
.collect(Collectors.toSet())
:Set
中。Collectors.toSet()
是一个收集器,用于将流的结果收集到一个集合中。
运行如下: