集合的练习题

练习1:随机点名器

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

java 复制代码
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();
    }
}

练习2:带概率的随机

需求:

​ 班级里有N个学生

​ 要求在随机的时候,70%的概率随机到男生,30%的概率随机到女生

java 复制代码
    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));
        }
    }

练习3:随机不重复

需求:

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

第一种方法

java 复制代码
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();

        }
    }
}

第二种方法

java 复制代码
    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();
    }

练习4:集合的嵌套

需求:

定义一个Map集合,键用表示省份名称province,值表示市city,但是市会有多个。

添加完毕后,遍历结果格式如下:

江苏省 = 南京市,扬州市,苏州市,无锡市,常州市

湖北省 = 武汉市,孝感市,十堰市,宜昌市,鄂州市

河北省 = 石家庄市,唐山市,邢台市,保定市,张家口市

java 复制代码
    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));
    }

练习 5: 斗地主发牌

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

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

具体规则:

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

java 复制代码
    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));
    }
相关推荐
我要吐泡泡了哦24 分钟前
GAMES104:15 游戏引擎的玩法系统基础-学习笔记
笔记·学习·游戏引擎
骑鱼过海的猫12324 分钟前
【tomcat】tomcat学习笔记
笔记·学习·tomcat
qmx_0725 分钟前
HTB-Jerry(tomcat war文件、msfvenom)
java·web安全·网络安全·tomcat
为风而战33 分钟前
IIS+Ngnix+Tomcat 部署网站 用IIS实现反向代理
java·tomcat
贾saisai2 小时前
Xilinx系FPGA学习笔记(九)DDR3学习
笔记·学习·fpga开发
技术无疆2 小时前
快速开发与维护:探索 AndroidAnnotations
android·java·android studio·android-studio·androidx·代码注入
北岛寒沫3 小时前
JavaScript(JS)学习笔记 1(简单介绍 注释和输入输出语句 变量 数据类型 运算符 流程控制 数组)
javascript·笔记·学习
烟雨666_java3 小时前
JDBC笔记
笔记
GEEKVIP3 小时前
Android 恢复挑战和解决方案:如何从 Android 设备恢复删除的文件
android·笔记·安全·macos·智能手机·电脑·笔记本电脑
铁匠匠匠4 小时前
从零开始学数据结构系列之第六章《排序简介》
c语言·数据结构·经验分享·笔记·学习·开源·课程设计