• 集合的练习题


    练习1:随机点名器

    需求:班级里有N个学生,实现随机点名器

    public class W1随机点名器 {
        public static void main(String[] args) {
            ArrayList<String> list = new ArrayList<>();
            Collections.addAll(list, "范闲", "范建", "范统", "杜子腾", "杜琦燕", "宋合泛", "侯笼藤", "朱益群", "朱穆朗玛峰", "袁明媛");
            // 思路一:
            Random r = new Random();
    		System.out.println("随机点到的是");
    		int n = r.nextInt(list.size());
    		System.out.println(list.get(n));
            System.out.println("点名结束");
            // 思路二 打乱集合,在获取第一个
            Collections.shuffle(list);
            System.out.println(list.get(0));
    		System.out.println("点名结束");
    		
            input.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    练习2:带概率的随机

    需求:
    ​ 班级里有N个学生
    ​ 要求在随机的时候,70%的概率随机到男生,30%的概率随机到女生

        public static void main(String[] args) {
            // 班级有N名学生
            ArrayList<String> boyList = new ArrayList<>();
            ArrayList<String> girlList = new ArrayList<>();
            Collections.addAll(boyList, "范闲", "范建", "范统", "杜子腾", "宋合泛", "侯笼藤", "朱益群", "朱穆朗玛峰");
            Collections.addAll(girlList, "杜琦燕", "袁明媛", "李猜", "田蜜蜜");
            ArrayList<Integer> nums = new ArrayList<>();
            Collections.addAll(nums, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0);
            Collections.shuffle(nums);
            int n = nums.get(0);
            if (n == 1) {
                Collections.shuffle(boyList);
                System.out.println(boyList.get(0));
            } else {
                Collections.shuffle(girlList);
                System.out.println(girlList.get(0));
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    练习3:随机不重复

    需求:
    ​ 班级里有 N 个学生,被点到的学生不会再被点到。但是如果班级中所有的学生都点完了,需要重新开启第二轮点名。

    第一种方法

    public class Test3 {
        public static void main(String[] args) {
           /* 班级里有5个学生
            要求:
            被点到的学生不会再被点到。
            但是如果班级中所有的学生都点完了,需要重新开启第二轮点名。*/
    
    
            //1.定义集合
            ArrayList<String> list1 = new ArrayList<>();
            //2.添加数据
            Collections.addAll(list1, "范闲", "范建", "范统", "杜子腾", "杜琦燕", "宋合泛", "侯笼藤", "朱益群", "朱穆朗玛峰", "袁明媛");
            //创建一个临时的集合,用来存已经被点到学生的名字
            ArrayList<String> list2 = new ArrayList<>();
            //外循环:表示轮数
            for (int i = 1; i <= 10; i++) {
                System.out.println("=========第" + i + "轮点名开始了======================");
                //3.获取集合的长度
                int count = list1.size();
                //4.随机点名
                Random r = new Random();
                //内循环:每一轮中随机循环抽取的过程
                for (int j = 0; j < count; j++) {
                    int index = r.nextInt(list1.size());
                    String name = list1.remove(index);
                    list2.add(name);
                    System.out.println(name);
                }
                //此时表示一轮点名结束
                //list1 空了 list2 10个学生的名字
                list1.addAll(list2);
                list2.clear();
    
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    第二种方法

        public static void main(String[] args) {
            ArrayList<String> list = new ArrayList<>();
            Collections.addAll(list, "范闲", "范建", "范统");
            // 思路一:讲这个集合复制一份,然后每次删除一个
            ArrayList<String> temp = new ArrayList<>(list);
            Collections.copy(temp, list);
            Random r = new Random();
            Scanner input = new Scanner(System.in);
            boolean index = true;
            while (index) {
                if (temp.isEmpty()) {
                    // 将这个list的值重新复制到temp集合中
                    temp.addAll(list);
                    System.out.println("copy成功");
                }
                System.out.println("随机点到的是");
                int n = r.nextInt(temp.size());
                System.out.println(temp.get(n));
                temp.remove(n);
                System.out.println("请确认是否再次点名: true / false");
                index = input.nextBoolean();
            }
            input.close();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    练习4:集合的嵌套

    需求:
    定义一个Map集合,键用表示省份名称province,值表示市city,但是市会有多个。
    添加完毕后,遍历结果格式如下:
    江苏省 = 南京市,扬州市,苏州市,无锡市,常州市
    湖北省 = 武汉市,孝感市,十堰市,宜昌市,鄂州市
    河北省 = 石家庄市,唐山市,邢台市,保定市,张家口市

        public static void main(String[] args) {
            Map<String, ArrayList<String>> map = new HashMap<>();
            map.put("湖北省", new ArrayList<>(Arrays.asList("武汉市", "孝感市", "十堰市", "宜昌市", "鄂州市")));
            map.put("江苏省", new ArrayList<>(Arrays.asList("南京市", "扬州市", "苏州市", "无锡市", "常州市")));
            map.put("河北省", new ArrayList<>(Arrays.asList("石家庄市", "唐山市", "邢台市", "保定市", "张家口市")));
            map.put("河南省", new ArrayList<>(Arrays.asList("郑州市", "洛阳市", "开封市", "平顶山市", "驻马店市")));
    
            // 遍历map集合
            map.forEach((String t, ArrayList<String> u) -> System.out.println(t + ":" + u));
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    练习 5: 斗地主发牌

    按照斗地主的规则,完成洗牌发牌的动作。具体规则:

    使用54张牌打乱顺序,三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。按照斗地主的规则,完成洗牌发牌的动作。
    具体规则:

    使用 54 张牌打乱顺序, 三个玩家参与游戏,三人交替摸牌,每人 17 张牌,最后三张留作底牌。

    
        public static void main(String[] args) {
            // 创建牌
            String[] color = new String[] { "红桃", "方片", "黑桃", "梅花" };
            String[] points = new String[] { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "J", "2" };
            String[] joker = new String[] { "小王", "大王" };
            // 创建集合来存储牌,然后在打乱集合,在分发
            ArrayList<card> list = new ArrayList<>();
            for (int i = 0; i < points.length; i++) {
                for (int j = 0; j < color.length; j++) {
                    list.add(new card(color[j], points[i]));
                }
            }
            list.add(new card("特殊", joker[0]));
            list.add(new card("特殊", joker[1]));
            // 打乱集合
            Collections.shuffle(list);
            // 分发数据
            ArrayList<card> player1 = new ArrayList<>();
            ArrayList<card> player2 = new ArrayList<>();
            ArrayList<card> player3 = new ArrayList<>();
            for (int i = 0; i < list.size() - 3;) {
                player1.add(list.get(i));
                i++;
                player2.add(list.get(i));
                i++;
                player3.add(list.get(i));
                i++;
            }
            System.out.println(list);
            System.out.println(player1);
            System.out.println(player2);
            System.out.println(player3);
            System.out.println("底牌");
            System.out.println(list.get(list.size() - 3));
            System.out.println(list.get(list.size() - 2));
            System.out.println(list.get(list.size() - 1));
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
  • 相关阅读:
    隧道网络对讲广播音频终端-智慧工地网络报警求助箱
    JVM与JMM的关系
    【学习笔记66】JavaScript的深浅拷贝
    golang trace view 视图详解
    Dubbo 架构介绍
    【毕业设计】基于深度学习卷积神经网络的手写字符识别
    YOLO系列 --- YOLOV7算法(七):YOLOV7算法总结
    Spring Cloud 之OpenFeign
    v-html指令怎么防止XSS注入
    [Dubbo3.0.8源码解析系列]-26-消费者一个服务是如何通过RPC调用到提供者的
  • 原文地址:https://blog.csdn.net/everything_study/article/details/132724295