集合进阶综合案例

一、小案例:自动点名器

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%的概率随机到女生。

分析
  • 不要想得太复杂:

    1. 我们定义一个概率集合,存入7个1,存入3个0,7个1表示70%概率,3个0表示30%概率
    2. 那么我们就可以定义两个集合分别用于存储男生和女生的姓名
    3. 当随机到1的时候,就去男生的集合中随机一个名字出来
    4. 当随机到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-集合进阶综合案例相关推荐

  1. 2021-08-19集合框架综合案例

    二.案例题目描述: 请实现一个简单的图书管理系统,要求如下: 1)定义图书类Book,具有属性账号id,书名name.作者author 和价格price,在创建图书对象时要求通过构造器进行创建,一次性 ...

  2. Java集合之Collection集合、泛型 【集合综合案例:赌神、赌侠、赌神斗地主】

    第一章. Collection集合 1.1 集合概述 集合:集合是java中提供的一种容器,可以用来存储多个数据. 集合和数组既然都是容器,它们有啥区别呢? 数组的长度是固定的.集合的长度是可变的. ...

  3. java项目斗地主介绍_详解java_ 集合综合案例:斗地主

    案例介绍 按照斗地主的规则,完成洗牌发牌的动作. 具体规则: 使用54张牌打乱顺序,三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌. 案例分析 1.准备牌: 牌可以设计为一个Array ...

  4. JAVA 集合综合案例 【吃货联盟】

    JAVA集合学习完成 做了一个[吃货联盟]的综合案例, 希望对大家有所帮助 如有BUG也请大佬们多多指正

  5. Java基础加强重温_05:Iterator迭代器、增强for循环、集合综合案例-斗地主、数据结构(栈、队列、数组、链表、红黑树)、List接口、Set接口

    摘要: Java基础加强重温_05: Iterator迭代器(指针跟踪元素). 增强for循环(格式.底层). 集合综合案例-斗地主(代码规范抽取代码,集合元素打乱). 数据结构[栈(先进后出,子弹夹 ...

  6. (27)css3 2D转换综合案例—卡包效果

    卡包效果实现思路如下: 1.将盒子的尺寸和图片的尺寸宽高度相同. 2.给图片设置绝对定位让他堆叠在盒子里面,相对于父亲,所以父亲设置相对定位,父相子绝. 3.给盒子添加鼠标hover事件,当鼠标移入的 ...

  7. 开源项目综合案例https://blog.csdn.net/m0_37700275/article/details/78783049

    开源项目综合案例 置顶 2017年12月12日 16:16:17 杨充 阅读数:473 版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/m0_37700275 ...

  8. Oracle 进阶详细案例教程笔记

    一.Oracle简介 ​ Oracle 是甲骨文公司使用 Java 语言开发的一款关系型数据库产品.又名 Oracle RDBMS (关系型数据库管理系统).Oracle 数据库是目前流行的关系数据库 ...

  9. PDF下载!《Python十大基础专题》《247个Python综合案例》《Pandas 20页学习笔记》...

    Python 技术栈 完整学习路线 如今书籍汗牛充栋,如何从零.循序渐进地掌握Python技术栈,成为很多读者朋友们关心的问题.最近,我特意按照Python技术栈的学习逻辑,把它划分为六个阶段,并且给 ...

最新文章

  1. 云服务收入年增长28%
  2. 你说我做丨为你定制「大局观版」职场设计课
  3. LwIP 之一 源码目录文件详解及移植说明
  4. windows渗透大全
  5. java垂直拆分,MyCat分片:垂直拆分实例解析和代码实现
  6. java concurrent包介绍及使用
  7. linux 版本的scipy,linux安装scipy
  8. HackRF 无线门铃信号录制与重放
  9. 11.11京东全球好物节战报出炉!苹果、华为全员卖疯...
  10. Python基础进阶之路(三)之列表
  11. 记一次new Map()
  12. 徐直军 华为没有鸿蒙,3亿只剩1亿?华为高管改口,推出鸿蒙到底有啥苦衷?
  13. nginx实现动态分离,解决css和js等图片加载问题
  14. Jquery 使用niceScroll.js 插件
  15. 075 定积分积分法之换元积分法
  16. Nuxt.js打包后报错DOMException: Failed to execute appendChild on Node
  17. 今天高考╮(╯▽╰)╭
  18. 扬州大学计算机专业考研分数线,扬州大学社会工作硕士历年复试分数线_社会工作考研分数线_复试线 - 希赛网...
  19. EMNLP 2020 | Facebook稠密向量召回方案
  20. 88e111驱动linux例子下载,佳能 Alaska GbE 88E1118R 驱动程序下载-更新佳能软件(收发器)...

热门文章

  1. mongodb简介_MongoDB简介
  2. coldfusion_ColdFusion中的一周:4月9日至15日:疯狂的代码
  3. 使用IDEA连接数据库
  4. c语言实现简单的多子棋游戏
  5. c语言万年历如何实现横向打印,用C语言如何编写“万年历”
  6. PHP入门(2) 程序控制语句 —— 选择结构语句
  7. CentOS配置ip
  8. CentOS 7.6升级系统内核
  9. php字体加粗,php imagettftext 水印 粗体
  10. python 抓包与解包