练习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));
}