27-集合进阶综合案例
集合进阶综合案例
一、小案例:自动点名器
1、点名器:简单的随机点名
需求
- 班级里有N个学生,实现随机点名器。
测试类
package com.app.demo32_sets_test;import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;public class Test1 {public static void main(String[] args) {/*案例:自动点名器1需求:班级里有N个学生,实现随机点名器。*/// 1.创建集合,用于存储学生姓名ArrayList<String> list = new ArrayList<>();// 2.添加数据到集合中Collections.addAll(list, "范闲", "令狐冲", "杨过", "杨康", "王重阳", "甄姬", "小乔", "大乔", "袁隆平");// 3.随机点名// 方式1:Random rd = new Random(); // 创建随机数对象int index = rd.nextInt(list.size()); // 生成一个随机索引String name = list.get(index); // 随机点一名学生System.out.println("随机点到了" + name + "同学~");System.out.println("--------------");// 方式2:// 打乱Collections.shuffle(list);String name2 = list.get(0);System.out.println("随机点到了" + name2 + "同学~");}
}
测试结果
随机点到了范闲同学~
--------------
随机点到了甄姬同学~Process finished with exit code 0
2、点名器:带概率的随机点名
需求
- 班级里有N个学生,要求70%的概率随机到男生、30%的概率随机到女生。
分析
- 不要想得太复杂:
- 我们定义一个概率集合,存入7个1,存入3个0,7个1表示70%概率,3个0表示30%概率
- 那么我们就可以定义两个集合分别用于存储男生和女生的姓名
- 当随机到1的时候,就去男生的集合中随机一个名字出来
- 当随机到0的时候,就去女生的集合中随机一个名字出来
- 这样就可以解决了概率的问题了
测试类
package com.app.demo32_sets_test;import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;public class Test2 {public static void main(String[] args) {/*小案例:自动点名器2需求:班级里有N个学生,要求70%的概率随机到男生、30%的概率随机到女生。男生名字:"关羽", "范闲", "诸葛亮", "孙悟空", "马云", "宋合泛", "呼延烈"女生名字:"波赛西", "小舞", "朱竹清", "甄姬", "蔡文姬"*/// 1.定义一个概率集合ArrayList<Integer> probableList = new ArrayList<>();// 2.存入7个1表示70%的概率,存入3个0表示30%的概率Collections.addAll(probableList, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0);// 3.将集合中所有的元素打乱Collections.shuffle(probableList);// 4.随机一个1或0Random rd = new Random();int index = rd.nextInt(probableList.size());int number = probableList.get(index);// System.out.println(number);// 5.创建两个集合分别用于存储男生、女生的名字ArrayList<String> boyList = new ArrayList<>();ArrayList<String> girlList = new ArrayList<>();// 6.分别往男生、女生的集合中添加名字Collections.addAll(boyList, "关羽", "范闲", "诸葛亮", "孙悟空", "马云", "宋合泛", "呼延烈");Collections.addAll(girlList, "波赛西", "小舞", "朱竹清", "甄姬", "蔡文姬");// 7.随机点名// 判断number是否为1if (number == 1) {// 是,则去男生的集合中随机一个名字出来int boyIndex = rd.nextInt(boyList.size());String boyName = boyList.get(boyIndex);System.out.println("随机点到了" + boyName + "同学~");} else {// 否,则去女生的集合中随机一个名字出来int girlIndex = rd.nextInt(girlList.size());String girlName = girlList.get(girlIndex);System.out.println("随机点到了" + girlName + "同学~");}}
}
测试结果
随机点到了呼延烈同学~Process finished with exit code 0
3、点名器:不重复的随机点名
需求
- 班级里有N个学生,要求被点过的学生不会再被点到,但是如果班级中所有的学生都点完了,需要重新开启第二轮点名。
分析
- 先把随机点名写出来,然后再一步一步完善。
- 再实现被点过的学生不会再被点到。
- 再实现但是如果班级中所有的学生都点完了。
- 最后实现重新开启第二轮点名。
测试类
package com.app.demo32_sets_test;import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;public class Test3 {public static void main(String[] args) {/*点名器:不重复的随机点名需求班级里有N个学生,要求被点过的学生不会再被点到,但是如果班级中所有的学生都点完了,需要重新开启第二轮点名。"关羽", "范闲", "诸葛亮", "孙悟空", "马云", "宋合泛", "呼延烈", "波赛西", "小舞", "朱竹清"*/// 1.定义集合,用于存储学生名字ArrayList<String> nameList = new ArrayList<>();// 2.添加名字到集合中Collections.addAll(nameList, "关羽", "范闲", "诸葛亮", "孙悟空", "马云", "宋合泛","呼延烈", "波赛西", "小舞", "朱竹清");// 3.创建一个临时的集合,用于将被点过的学生名字存储起来ArrayList<String> tempList = new ArrayList<>();// 4.随机点名// 创建随机数对象Random rd = new Random();// 外循环:表示轮数for (int i = 1; i <= 3; i++) {System.out.println("=======第" + i + "轮随机点名开始=======");// 为了避免每循环1次,集合长度-1的情况,先在内循环外将集合长度获取出来int size = nameList.size();// 内循环:每轮中随机循环抽取的过程for (int j = 0; j < size; j++) {// 生成一个随机索引int index = rd.nextInt(nameList.size());// 随机点一个名字出来,并将点到的学生删除掉,避免下次再点到String name = nameList.remove(index);// 将被点过的学生名字存储到临时集合中tempList.add(name);System.out.println(name);}// 5.循环结束,此时nameList集合已经空了,tempList已经将所有被点过的学生名字都存储起来了// 每轮随机点名结束后,需要将tempList集合中的所有名字 重新给到 nameList集合nameList.addAll(tempList);// 然后将tempList集合清空,这样下一轮点名后,里面的数据才不会重复tempList.clear();}}
}
测试结果
=======第1轮随机点名开始=======
小舞
范闲
宋合泛
呼延烈
孙悟空
波赛西
关羽
诸葛亮
马云
朱竹清
=======第2轮随机点名开始=======
朱竹清
范闲
诸葛亮
马云
关羽
波赛西
小舞
孙悟空
宋合泛
呼延烈
=======第3轮随机点名开始=======
孙悟空
呼延烈
范闲
马云
小舞
关羽
朱竹清
宋合泛
波赛西
诸葛亮Process finished with exit code 0
二、小案例:省和市(集合嵌套)
需求
需要一个Map集合,键用省份名称(province),值用市(city),但是市会有多个。
添加完毕后,遍历结果格式如下:
江苏省 = 南京市,扬州市,苏州市,无锡市,常州市 湖北省 = 武汉市,孝感市,十堰市,宜昌市,鄂州市 河北省 = 石家庄市,唐山市,邢台市,保定市,张家口市
测试类
package com.app.demo32_sets_test;import java.util.*;public class Test4 {public static void main(String[] args) {/*案例:省和市(集合嵌套)需求:需要一个Map集合,键用省份名称(province),值用市(city),但是市会有多个。添加完毕后,遍历结果格式如下:江苏省 = 南京市,扬州市,苏州市,无锡市,常州市湖北省 = 武汉市,孝感市,十堰市,宜昌市,鄂州市河北省 = 石家庄市,唐山市,邢台市,保定市,张家口市*/// 1.创建Map集合,键:省份名称,值:市(集合:多个城市)HashMap<String, ArrayList<String>> hm = new HashMap<>();// 2.创建单列集合,用于存储多个城市ArrayList<String> city1 = new ArrayList<>();// 添加城市Collections.addAll(city1, "南京市", "扬州市", "苏州市", "无锡市", "常州市");ArrayList<String> city2 = new ArrayList<>();Collections.addAll(city2, "武汉市", "孝感市", "十堰市", "宜昌市", "鄂州市");ArrayList<String> city3 = new ArrayList<>();Collections.addAll(city3, "石家庄市", "唐山市", "邢台市", "保定市", "张家口市");// 3.往Map集合中添加各个省份与各个省份的城市集合hm.put("江苏省", city1);hm.put("湖北省", city2);hm.put("河北省", city3);// 按照指定的格式拼接各个省份与各个省份的每个市// 方式1// 4.外循环:遍历Map集合,依次得到每个省份和市的集合(得到所有的键值对)hm.forEach((province, citys) -> {// 获取当前省份的所有市集合的长度int size = citys.size();// 先拼接当前省份(键对象)System.out.print(province + " = ");// 内循环:遍历当前省份的市集合,依次得到当前省份的每个市(得到所有的值对象)for (int i = 0; i < size; i++) {// 如果当前位置是集合中的末尾,则不拼接逗号,否则拼接逗号System.out.print(i == size - 1 ? citys.get(i) : citys.get(i) + ",");}// 循环结束!说明当前省份的所有城市已经拼接完成!输出个换行System.out.println();});System.out.println("---------------------------------------");// 方式2Set<Map.Entry<String, ArrayList<String>>> entries = hm.entrySet();entries.forEach(entry -> {// 获取所有的键对象String province = entry.getKey();// 获取所有的值对象的集合ArrayList<String> citys = entry.getValue();// 创建StringJoiner对象,用于按照指定的格式拼接各个省份与各个省份的所有城市// 参数一:分隔符——>用逗号隔开;参数二:开始符——>不需要拼接任何东西;参数三:结束符:不需要拼接任何东西StringJoiner sj = new StringJoiner(",", "", "");// 遍历值对象集合,依次获取每个城市,并且拼接每个城市citys.forEach(city -> sj.add(city));// 输出最终拼接结果System.out.println(province + " = " + sj);});}
}
测试结果
江苏省 = 南京市,扬州市,苏州市,无锡市,常州市
湖北省 = 武汉市,孝感市,十堰市,宜昌市,鄂州市
河北省 = 石家庄市,唐山市,邢台市,保定市,张家口市
---------------------------------------
江苏省 = 南京市,扬州市,苏州市,无锡市,常州市
湖北省 = 武汉市,孝感市,十堰市,宜昌市,鄂州市
河北省 = 石家庄市,唐山市,邢台市,保定市,张家口市Process finished with exit code 0
27-集合进阶综合案例相关推荐
- 2021-08-19集合框架综合案例
二.案例题目描述: 请实现一个简单的图书管理系统,要求如下: 1)定义图书类Book,具有属性账号id,书名name.作者author 和价格price,在创建图书对象时要求通过构造器进行创建,一次性 ...
- Java集合之Collection集合、泛型 【集合综合案例:赌神、赌侠、赌神斗地主】
第一章. Collection集合 1.1 集合概述 集合:集合是java中提供的一种容器,可以用来存储多个数据. 集合和数组既然都是容器,它们有啥区别呢? 数组的长度是固定的.集合的长度是可变的. ...
- java项目斗地主介绍_详解java_ 集合综合案例:斗地主
案例介绍 按照斗地主的规则,完成洗牌发牌的动作. 具体规则: 使用54张牌打乱顺序,三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌. 案例分析 1.准备牌: 牌可以设计为一个Array ...
- JAVA 集合综合案例 【吃货联盟】
JAVA集合学习完成 做了一个[吃货联盟]的综合案例, 希望对大家有所帮助 如有BUG也请大佬们多多指正
- Java基础加强重温_05:Iterator迭代器、增强for循环、集合综合案例-斗地主、数据结构(栈、队列、数组、链表、红黑树)、List接口、Set接口
摘要: Java基础加强重温_05: Iterator迭代器(指针跟踪元素). 增强for循环(格式.底层). 集合综合案例-斗地主(代码规范抽取代码,集合元素打乱). 数据结构[栈(先进后出,子弹夹 ...
- (27)css3 2D转换综合案例—卡包效果
卡包效果实现思路如下: 1.将盒子的尺寸和图片的尺寸宽高度相同. 2.给图片设置绝对定位让他堆叠在盒子里面,相对于父亲,所以父亲设置相对定位,父相子绝. 3.给盒子添加鼠标hover事件,当鼠标移入的 ...
- 开源项目综合案例https://blog.csdn.net/m0_37700275/article/details/78783049
开源项目综合案例 置顶 2017年12月12日 16:16:17 杨充 阅读数:473 版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/m0_37700275 ...
- Oracle 进阶详细案例教程笔记
一.Oracle简介 Oracle 是甲骨文公司使用 Java 语言开发的一款关系型数据库产品.又名 Oracle RDBMS (关系型数据库管理系统).Oracle 数据库是目前流行的关系数据库 ...
- PDF下载!《Python十大基础专题》《247个Python综合案例》《Pandas 20页学习笔记》...
Python 技术栈 完整学习路线 如今书籍汗牛充栋,如何从零.循序渐进地掌握Python技术栈,成为很多读者朋友们关心的问题.最近,我特意按照Python技术栈的学习逻辑,把它划分为六个阶段,并且给 ...
最新文章
- 云服务收入年增长28%
- 你说我做丨为你定制「大局观版」职场设计课
- LwIP 之一 源码目录文件详解及移植说明
- windows渗透大全
- java垂直拆分,MyCat分片:垂直拆分实例解析和代码实现
- java concurrent包介绍及使用
- linux 版本的scipy,linux安装scipy
- HackRF 无线门铃信号录制与重放
- 11.11京东全球好物节战报出炉!苹果、华为全员卖疯...
- Python基础进阶之路(三)之列表
- 记一次new Map()
- 徐直军 华为没有鸿蒙,3亿只剩1亿?华为高管改口,推出鸿蒙到底有啥苦衷?
- nginx实现动态分离,解决css和js等图片加载问题
- Jquery 使用niceScroll.js 插件
- 075 定积分积分法之换元积分法
- Nuxt.js打包后报错DOMException: Failed to execute appendChild on Node
- 今天高考╮(╯▽╰)╭
- 扬州大学计算机专业考研分数线,扬州大学社会工作硕士历年复试分数线_社会工作考研分数线_复试线 - 希赛网...
- EMNLP 2020 | Facebook稠密向量召回方案
- 88e111驱动linux例子下载,佳能 Alaska GbE 88E1118R 驱动程序下载-更新佳能软件(收发器)...