综合练习
综合练习1:随机点名器的两种实现方式

(源代码)
java
package com.itheima.a08test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
public class Test1 {
public static void main(String[] args) {
/* 班级里有N个学生,学生属性:姓名,年龄,性别。
实现随机点名器。*/
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"张三","李四","王五","赵六","钱七");
//方式一:
Random r = new Random();
int index = r.nextInt(list.size());
String name1 = list.get(index);
System.out.println(name1);
System.out.println("------------------------------");
//方式二:
Collections.shuffle(list);
String name2 = list.get(0);
System.out.println(name2);
}
}
(运行结果截图)

综合练习2:带有概率的随机点名

(源代码)
java
package com.itheima.a08test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
public class Test2 {
public static void main(String[] args) {
/* 班级里有N个学生
要求:
70%的概率随机到男生
30%的概率随机到女生
"范闲","范建","范统","杜子腾","宋合泛","侯笼藤","朱益群","朱穆朗玛峰"
"杜琦燕","袁明媛","李猜","田蜜蜜"
*/
//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);
System.out.println(list);
//4.从list集合中随机抽取0或者1
Random 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){
//boyList
int boyIndex = r.nextInt(boyList.size());
String boy = boyList.get(boyIndex);
System.out.println(boy);
}else{
//girlList
int girlIndex = r.nextInt(girlList.size());
String girl = boyList.get(girlIndex);
System.out.println(girl);
}
}
}
(运行结果截图)

综合练习3:不重复的随机点名

shift + F6 批量改名
Ctrl + Alt + L 格式化代码
(源代码)
java
package com.itheima.a08test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
public class Test3 {
public static void main(String[] args) {
/* 班级里有N个学生
要求:
被点到的学生不会再被点到。
但是如果班级中所有的学生都点完了,需要重新开启第二轮点名。
"范闲", "范建", "范统", "杜子腾", "杜琦燕", "宋合泛", "侯笼藤", "朱益群", "朱穆朗玛峰", "袁明媛"*/
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"范闲", "范建", "范统", "杜子腾", "杜琦燕", "宋合泛", "侯笼藤", "朱益群", "朱穆朗玛峰", "袁明媛");
ArrayList<String> list2 = new ArrayList<>();
for (int i = 0; i < 10; i++) {
System.out.println("第" + i + "轮点名开始了");
int length = list.size();
Random r = new Random();
for (int j = 0; j < length; j++) {
int index = r.nextInt(list.size());
String name = list.remove(index);
list2.add(name);
System.out.println(name);
}
list.addAll(list2);
list2.clear();
}
}
}
(运行结果截图)

综合练习6:集合嵌套

shift + F6 批量更改
(源代码)
java
package com.itheima.a08test;
import java.util.*;
public class Test6 {
public static void main(String[] args) {
/* 需求
定义一个Map集合,键用表示省份名称province,值表示市city,但是市会有多个。
添加完毕后,遍历结果格式如下:
江苏省 = 南京市,扬州市,苏州市,无锡市,常州市
湖北省 = 武汉市,孝感市,十堰市,宜昌市,鄂州市
河北省 = 石家庄市,唐山市,邢台市,保定市,张家口市*/
HashMap<String,ArrayList<String>> hm = new HashMap<>();
ArrayList<String> list1 = new ArrayList<>();
list1.add("南京市");
list1.add("扬州市");
list1.add("苏州市");
list1.add("无锡市");
list1.add("常州市");
ArrayList<String> list2 = new ArrayList<>();
list2.add("武汉市");
list2.add("孝感市");
list2.add("十堰市");
list2.add("宜昌市");
list2.add("鄂州市");
ArrayList<String> list3 = new ArrayList<>();
list3.add("石家庄市");
list3.add("唐山市");
list3.add("邢台市");
list3.add("保定市");
list3.add("张家口市");
hm.put("江苏省",list1);
hm.put("湖北省",list2);
hm.put("河北省",list3);
//把数据添加到HashMap
Set<HashMap.Entry<String,ArrayList<String>>> entries = hm.entrySet();
for (Map.Entry<String, ArrayList<String>> entry : entries) {
String key = entry.getKey();
ArrayList<String> value = entry.getValue();
//拼接
StringJoiner sj = new StringJoiner(",");
for (String s : value) {
sj.add(s);
}
System.out.println(key + " = " + sj);
}
}
}
(运行结果截图)

斗地主
01-准备牌、洗牌、发牌

(分析)

(源代码)
App
java
package com.itheima.doudizhu1;
public class App {
public static void main(String[] args) {
/*
完成控制台版的三步:
准备牌
洗牌
发牌
*/
new PokerGame();
}
}
PokerGame
java
package com.itheima.doudizhu1;
import java.util.ArrayList;
import java.util.Collections;
public class PokerGame {
static ArrayList<String> list = new ArrayList<>();
//准备牌
static{
String[] color = {"♥","♦","♣","♠"};
String[] number = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
for(String c : color){
for(String n : number) {
list.add(c + n);
}
}
list.add("大王");
list.add("小王");
}
public PokerGame() {
System.out.println(list);
//洗牌
Collections.shuffle(list);
//发牌
ArrayList<String> load = new ArrayList<>();
ArrayList<String> player1 = new ArrayList<>();
ArrayList<String> player2 = new ArrayList<>();
ArrayList<String> player3 = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
String poker = list.get(i);
if (i <= 2) {
load.add(poker);
continue;
}
if (i % 3 == 0) {
player1.add(poker);
} else if (i % 3 == 1) {
player2.add(poker);
} else if (i % 3 == 2) {
player3.add(poker);
}
}
lookPoker("底牌",load);
lookPoker("刚脑壳",player1);
lookPoker("大帅比",player2);
lookPoker("蛋筒",player3);
}
//看牌
public void lookPoker(String name,ArrayList<String> list) {
System.out.print(name + ":");
for(String poker : list){
System.out.print(poker + " ");
}
System.out.println();
}
}
(运行结果截图)

02-第一种排序方式

(分析)


(源代码)
App
java
package com.itheima.doudizhu2;
public class App {
public static void main(String[] args) {
new PokerGame();
}
}
PokerGame
java
package com.itheima.doudizhu2;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;
public class PokerGame {
//牌盒
static HashMap<Integer,String> hm = new HashMap<>();
static ArrayList<Integer> list = new ArrayList<>();
static{
String[] color = {"♥","♦","♣","♠"};
String[] number = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
int serialNumber = 1;
for (String n : number) {
for (String c : color) {
hm.put(serialNumber,c + n);
list.add(serialNumber);
serialNumber++;
}
}
hm.put(serialNumber,"小王");
list.add(serialNumber);
serialNumber++;
hm.put(serialNumber,"大王");
list.add(serialNumber);
/*System.out.println(hm);
{1=♥3, 2=♦3, 3=♣3, 4=♠3, 5=♥4, 6=♦4, 7=♣4, 8=♠4, 9=♥5, 10=♦5, 11=♣5, 12=♠5, 13=♥6, 14=♦6, 15=♣6, 16=♠6,
17=♥7, 18=♦7, 19=♣7, 20=♠7, 21=♥8, 22=♦8, 23=♣8, 24=♠8, 25=♥9, 26=♦9, 27=♣9, 28=♠9, 29=♥10, 30=♦10, 31=♣10, 32=♠10,
33=♥J, 34=♦J, 35=♣J, 36=♠J, 37=♥Q, 38=♦Q, 39=♣Q, 40=♠Q, 41=♥K, 42=♦K, 43=♣K, 44=♠K, 45=♥A, 46=♦A, 47=♣A, 48=♠A,
49=♥2, 50=♦2, 51=♣2, 52=♠2, 53=小王, 54=大王}
*/
}
public PokerGame(){
//洗牌
Collections.shuffle(list);
//发牌
TreeSet<Integer> load = new TreeSet<>();
TreeSet<Integer> player1 = new TreeSet<>();
TreeSet<Integer> player2 = new TreeSet<>();
TreeSet<Integer> player3 = new TreeSet<>();
for (int i = 0; i < list.size(); i++) {
int serialNumber = list.get(i);
if(i <= 2){
load.add(serialNumber);
continue;
}
if(i % 3 == 0){
player1.add(serialNumber);
}else if(i % 3 ==1){
player2.add(serialNumber);
}else{
player3.add(serialNumber);
}
}
//看牌
lookPoker("底牌",load);
lookPoker("刚脑壳",player1);
lookPoker("大帅比",player2);
lookPoker("蛋筒",player3);
}
public void lookPoker(String name,TreeSet<Integer> ts){
System.out.print(name + ":");
for (int serialNumber : ts) {
String poker = hm.get(serialNumber);
System.out.print(poker + " ");
}
System.out.println();
}
}
(运行结果截图)

03-第二种排序方式

(源代码)
java
package com.itheima.doudizhu3;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
public class PokerGame {
//牌盒
static ArrayList<String> list = new ArrayList<>();
//创建一个集合,用来添加牌的价值
static HashMap<String, Integer> hm = new HashMap<>();
static {
//准备牌
String[] color = {"♦", "♣", "♥", "♠"};
String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
for (String c : color) {
for (String n : number) {
list.add(c + n);
}
}
list.add(" 小王");
list.add(" 大王");
//指定牌的价值
//牌上的数字到Map集合中判断是否存在
//存在,获取价值
//不存在,本身的数字就是价值
hm.put("J", 11);
hm.put("Q", 12);
hm.put("K", 13);
hm.put("A", 14);
hm.put("2", 15);
hm.put("小王", 50);
hm.put("大王", 100);
}
public PokerGame() {
//洗牌
Collections.shuffle(list);
//发牌
ArrayList<String> lord = new ArrayList<>();
ArrayList<String> player1 = new ArrayList<>();
ArrayList<String> player2 = new ArrayList<>();
ArrayList<String> player3 = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
String poker = list.get(i);
//发底牌
if (i <= 2) {
lord.add(poker);
continue;
}
//给三个玩家轮流发牌
if (i % 3 == 0) {
player1.add(poker);
} else if (i % 3 == 1) {
player2.add(poker);
} else {
player3.add(poker);
}
}
//排序
order(lord);
order(player1);
order(player2);
order(player3);
//看牌
lookPoker("底牌",lord);
lookPoker("钢脑壳",player1);
lookPoker("大帅比",player2);
lookPoker("蛋筒",player3);
}
/*
* 参数一:玩家的名字
* 参数二:每位玩家的牌
* */
public void lookPoker(String name, ArrayList<String> list){
System.out.print(name + ": ");
for (String poker : list) {
System.out.print(poker + " ");
}
System.out.println();
}
//利用牌的价值进行排序
//参数:集合
//♥5 ♥3 ♥6 ♥7 ♥9
public void order(ArrayList<String> list){
Collections.sort(list, new Comparator<String>() {
//Array.sort (插入排序 + 二分查找)
@Override
public int compare(String o1, String o2) {
//o1:表示当前要插入到有序序列中的牌
//o2:表示已经在有序序列中存在的牌
//负数:o1小 插入到前面
//正数:o1大 插入到后面
//0:o1的数字跟o2的数字是一样的,需要按照花色再次排序
//1.计算o1的花色和价值 大王
String color1 = o1.substring(0, 1);
int value1 = getValue(o1);
//2.计算o2的花色和价值
String color2 = o2.substring(0, 1);
int value2 = getValue(o2);
//3.比较o1和o2的价值 ♥3 ♠3
int i = value1 - value2;
return i == 0 ? color1.compareTo(color2) : i;
}
});
}
//计算牌的价值
//参数:牌
//返回值:价值
public int getValue(String poker){//♥3
//获取牌上的数字
String number = poker.substring(1);//把这里截取出来的结果,让这个结果再Map集合中存在 " 大王"
//拿着数字到map集合中判断是否存在
if(hm.containsKey(number)){
//存在,获取价值
return hm.get(number);
}else{
//不存在,类型转换
return Integer.parseInt(number);
}
}
}
(运行结果截图)
