当前位置: 首页 > news >正文

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 的好处是可以自动去重,确保每个年份只出现一次。 

代码分解

  1. olympicCityMap.entrySet():

    获取 olympicCityMap 中所有的键值对(Map.Entry 对象)的集合。
  2. .stream():

    将集合转换为一个流(Stream),以便可以使用流操作(如过滤、映射等)
  3. .filter(entry -> entry.getValue().equals(city)):使用 filter 方法来筛选流中的元素。这里的 entryMap.Entry 对象,entry.getValue() 返回与该条目关联的城市名。只有当城市名与给定的 city 变量相等时,该条目才会被保留在流中。
  4. .map(Map.Entry::getKey):

    使用 map 方法将流中的每个 Map.Entry 对象转换为其键(年份)。Map.Entry::getKey 是方法引用,表示调用 getKey() 方法。
  5. .collect(Collectors.toSet()):

    将流中的元素收集到一个 Set 中。Collectors.toSet() 是一个收集器,用于将流的结果收集到一个集合中。

 运行如下:

 

http://www.dtcms.com/a/123357.html

相关文章:

  • docker安装nginx,基础命令,目录结构,配置文件结构
  • 0410 | 软考高项笔记:项目管理概述
  • jQuery多库共存
  • 甘特图和里程碑趋势图在项目监控中有哪些实际应用?
  • 本地laravel项目【dcat-admin】部署到liunx服务器
  • 论文笔记:Dynamic Spectral Graph Anomaly Detection
  • 先占个日常,等会写。
  • 如何白嫖Grok3 API? 如何使用Grok3 API调用实例?怎么使用Grok3模型?
  • 从零实现Agent智能体配置使用(Ragflow)
  • 多模态大模型在目标检测领域的最新进展
  • JS包装类型Object
  • AutoKeras 处理图像回归预测
  • spark-core学习内容总结
  • 【完美解决】VSCode连接HPC节点,已配置密钥却还是提示需要输入密码
  • 京华幻梦:科技自然共生诗篇
  • 【蓝桥杯】二分查找
  • springcloud进阶
  • SkyWalking + ELK 全链路监控系统整合指南
  • FPGA_DDR(二)
  • Go语言编写一个进销存Web软件的demo
  • python基础语法1:输入输出
  • Java 基础 - 反射(1)
  • Java学习——day26(线程同步与共享资源保护)
  • FastAPI用户认证系统开发指南:从零构建安全API
  • Cloudflare 缓存工作原理
  • ComfyUI_Echomimic部署问题集合
  • 企业信息化-系统架构师(九十八)
  • 玩转Docker | 使用Docker搭建pinry图片展示系统
  • swagger + Document
  • 修改 docker 工作目录