小汤学编程之JAVA经典例题——嵌套集合

题目:

有一个记事本,能记录周一到周天,每天做的所有事情和事情的次数,周而复始。小明在这个记事本上记录了3周,内容如下:

第一周
·周一:学java,逛街
·周二:打台球,旅游
·周三:溜冰,吃烧烤
·周四:打篮球,逛街,吃烧烤
·周五:学前端,溜冰
·周六:逛街,吃烧烤
·周天:旅游,打台球

第二周:
·周一:学java,学前端
·周二:打台球,溜冰,学java
·周三:旅游,吃烧烤
·周四:逛街,学java
·周五:学前端,旅游
·周六:逛街,打台球,吃烧烤
·周天:旅游,逛街,打台球,吃烧烤

·第三周:
·周一:学java,学前端,学python
·周二:打台球,溜冰,学java,学C++
·周三:旅游,吃烧烤,吃冰淇淋
·周四:逛街,学java,吃烧烤
·周五:学前端,旅游,打高尔夫
·周六:逛街,打台球,吃烧烤,溜冰,蹦迪
·周天:旅游,逛街,打台球,吃烧烤,跑步

使用Scanner接收小明3周所做的所有事情,并存入相应的集合中。然后输出周一到周五(不区分第几周)小明所做的所有事情以及相应的次数。(要求:所选的集合都要用泛型进行约束。)

方法一(使用集合嵌套):

public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //创建嵌套集合
        TreeMap<String, Map<String, Integer>> week = new TreeMap<>();
        //数据录入
        for (int i = 1; i <= 3; i++) {//外层for循环代表周次
            System.out.println("第" + i + "周:");
            HashMap<String, Integer> map;
            for (int j = 1; j <= 7; j++) {//内层for循环代表星期几
                map = new HashMap<>();//每天都会清空昨天的事情和次数
                System.out.print("周" + j + ":");
                String things = sc.next();//旅游,逛街,打台球,吃烧烤,跑步等
                String[] things_arr = things.split(",");//用逗号切割字符串,再存入map
                for (String s : things_arr) {
                    //map存入的是:事情和次数
                    map.put(s, map.containsKey(s) ? map.get(s) + 1 : 1);
                }
                //将map存入week集合,第一次直接存入,后面存入的是新旧结合后的map
                if (week.containsKey("周" + j)) {
                    Map<String, Integer> map1 = week.get("周" + j);
                    //新旧map按如下方式结合
                    Set<String> keys = map.keySet();
                    for (String key : keys) {
                        if (map1.containsKey(key)) {
                            map1.put(key, map1.get(key) + map.get(key));
                        } else {
                            map1.put(key, map.get(key));
                        }
                    }
                } else {
                    week.put("周" + j, map);
                }
            }
        }
        //数据输出 week 遍历键值对
        Set<Map.Entry<String, Map<String, Integer>>> weeks = week.entrySet();
        for (Map.Entry<String, Map<String, Integer>> week1 : weeks) {
            System.out.println(week1.getKey() + ":");
            Map<String, Integer> map = week1.getValue();
            //里面的 map 也遍历键值对
            Set<Map.Entry<String, Integer>> things = map.entrySet();
            for (Map.Entry<String, Integer> thing : things) {
                String key = thing.getKey();
                Integer count = thing.getValue();
                System.out.print(key + "--" + count + "次 \t");
            }
            System.out.println();//换行
        }
    }
}

结果:
在这里插入图片描述

方法一(不使用集合嵌套):

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        TreeMap<String, String> wt = new TreeMap<>();// 创建 星期-事件 键值对的map集合
        TreeMap<String, Integer> tt = new TreeMap<>();// 创建 事件-次数 键值对的map集合
        TreeMap<Integer, String> w = new TreeMap<>();// 创建 序号-星期 键值对的map集合,并将一周七天添加进来
        w.put(1, "周一");
        w.put(2, "周二");
        w.put(3, "周三");
        w.put(4, "周四");
        w.put(5, "周五");
        w.put(6, "周六");
        w.put(7, "周天");
        // 数据输入
        for (int i = 1; i <= 3; i++) {// 外层for表示周次
            System.out.println("\t第" + i + "周:");
            for (int j = 1; j <= 7; j++) {// 内层for表示星期几
                String strw = w.get(j);// 由序号-星期 键值对的map集合 得到星期的字符串
                System.out.print(strw + ":");
                String str = sc.next();// 由输入得到事件的总字符串
                // 第一次将事件字符串直接添加,后面则与原事件字符串进行拼接后添加
                if (wt.containsKey(strw)) {
                    wt.put(strw, wt.get(strw) + "," + str);
                } else {
                    wt.put(strw, str);
                }
            }
        }
        // 结果输出
        for (int i = 1; i <= 7; i++) {// 循环每周七天,每天分别输出
            // 调取该星期的事件总字符串,由事件总字符串获得对应的 事件-次数 键值对的map集合
            String strw = w.get(i);
            for (String s : wt.get(strw).split(",")) {
                if (tt.containsKey(s))
                    tt.replace(s, tt.get(s) + 1);
                else
                    tt.put(s, 1);
            }
            // 根据 事件-次数 键值对的map集合 进行输出
            System.out.print("\n" + strw + "做的事:");
            Set keys = tt.keySet();
            for (Object key : keys) {
                System.out.print(key + "(" + tt.get(key) + "次)" + ",");
            }
            tt.clear();// 每星期输出完毕后,都清空 事件-次数 键值对的map集合,方便后续输出
        }
    }

结果:在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值