练习1:随机点名器
需求:班级里有N个学生,实现随机点名器。
分析:有两种实现方式,随机生成索引和使用shuffle方法打乱元素后获取0索引处的元素。
代码实现:
public class Test1 {public static void main(String[] args) {//1.定义集合ArrayList<String> list = new ArrayList<>();//2.添加数据Collections.addAll(list,"范闲","范建","范统","杜子腾","杜琦燕","宋合泛","侯笼藤","朱益群","朱穆朗玛峰","袁明媛");//3.随机点名/* Random r = new Random();int index = r.nextInt(list.size());String name = list.get(index);System.out.println(name);*/
//打乱Collections.shuffle(list);
String name = list.get(0);System.out.println(name);
}
}
练习2:带概率的随机
需求:班级里有N个学生。要求在随机的时候,70%的概率随机到男生,30%的概率随机到女生。
代码实现:
public class Test2 {public static void main(String[] args) {//1.创建集合ArrayList<Integer> list = new ArrayList<>();//2.添加数据Collections.addAll(list,1,1,1,1,1,1,1);Collections.addAll(list,0,0,0);//3.打乱集合中的数据Collections.shuffle(list);//4.从list集合中随机抽取0或者1Random r = new Random();int index = r.nextInt(list.size());int number = list.get(index);System.out.println(number);//5.创建两个集合分别存储男生和女生的名字ArrayList<String> boyList = new ArrayList<>();ArrayList<String> girlList = new ArrayList<>();Collections.addAll(boyList,"范闲","范建","范统","杜子腾","宋合泛","侯笼藤","朱益群","朱穆朗玛峰");Collections.addAll(girlList,"杜琦燕","袁明媛","李猜","田蜜蜜");//6.判断此时是从boyList里面抽取还是从girlList里面抽取if(number == 1){//boyListint boyIndex = r.nextInt(boyList.size());String name = boyList.get(boyIndex);System.out.println(name);}else{//girlListint girlIndex = r.nextInt(girlList.size());String name = girlList.get(girlIndex);System.out.println(name);}}
}
练习3:随机不重复
需求:班级里有N个学生,被点到的学生不会再被点到。但是如果班级中所有的学生都点完了, 需要重新开启第二轮点名。
分析:使用remove方法模拟点到的学生,并将其添加到一个新的集合中,点名结束后重新将其赋给原始集合,再次循环。
代码实现:
public class Test3 {public static void main(String[] args) {//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();}}
}
练习4:集合的嵌套
需求:定义一个Map集合,键用表示省份名称province,值表示市city,但是市会有多个。添加完毕后,遍历结果格式如下:
江苏省 = 南京市,扬州市,苏州市,无锡市,常州市
湖北省 = 武汉市,孝感市,十堰市,宜昌市,鄂州市
public class Test4 {public static void main(String[] args) {//1.创建Map集合HashMap<String, ArrayList<String>> hm = new HashMap<>();//2.创建单列集合存储市ArrayList<String> city1 = new ArrayList<>();city1.add("南京市");city1.add("扬州市");city1.add("苏州市");city1.add("无锡市");city1.add("常州市");ArrayList<String> city2 = new ArrayList<>();city2.add("武汉市");city2.add("孝感市");city2.add("十堰市");city2.add("宜昌市");city2.add("鄂州市");ArrayList<String> city3 = new ArrayList<>();city3.add("石家庄市");city3.add("唐山市");city3.add("邢台市");city3.add("保定市");city3.add("张家口市");//3.把省份和多个市添加到map集合hm.put("江苏省",city1);hm.put("湖北省",city2);hm.put("河北省",city3);Set<Map.Entry<String, ArrayList<String>>> entries = hm.entrySet();for (Map.Entry<String, ArrayList<String>> entry : entries) {//entry依次表示每一个键值对对象String key = entry.getKey();ArrayList<String> value = entry.getValue();StringJoiner sj = new StringJoiner(", ","","");for (String city : value) {sj.add(city);}System.out.println(key + " = " + sj);}}
}