Java进阶-ArrayList和Comparator的练习
问题描述
目前需要模拟出斗地主除了打牌以外的所有场景,具体需要实现的功能如下:
1.创建出一副扑克牌
2.洗牌
3.发牌
4.清牌
5.看牌
解决思路
1.创牌
创建两个字符串数组,分别用来装扑克牌的花色和牌面数值,再利用字符串拼接,去组装成扑克,其中大王、小王单独添加到扑克牌中去
2.洗牌
利用集合工具类Collections去实现打散牌的功能
Collections.shuffle();
static void shuffle(List<?> list)
使用默认随机源对指定列表进行置换。
3.发牌
创建四个容器,分别去装三张地主牌,玩家一、玩家二、玩家三的牌
地主牌一般都是扑克牌中最后三张牌作为地主牌
剩余的牌一次分发给三个玩家,可以用模运算,将剩余的牌平均分给三个玩家
4.清牌
因为扑克牌的数值大小排列规则比较特殊,不是常见的,所以我们需要自定义排序规则
可以使用Collections工具类中的sort方法,使用Comparator比较器,并且自定义排序规则
static <T> void sort(List<T> list, Comparator<? super T> c)
根据指定比较器产生的顺序对指定列表进行排序。
可以通过新建一个数组装入所有的牌面数值,并且按照牌面从小到大的顺序装入,这样只要通过查询该数组,便可得知当前牌的牌面大小,就可以将两张牌在该数组中的索引位置,进行大小判断,达到排序的功能
!但是存在一个问题,该牌面数值的数组只能一个个添加元素进行非常的麻烦,有什么办法可以优化这里呢?可以使用Collections工具类中的addAll方法
static <T> boolean addAll(Collection<? super T> c, T... elements)
将所有指定元素添加到指定 collection 中。
5.看牌
输出打印四个集合的内容即可
代码实现
package com.tan.comparator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class PlayingCard {
public static void main(String[] args) {
ArrayList<String> card = new ArrayList<>();
String[] flowers = {"♠","♦","♥","♣"};
String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
for (String flower : flowers) {
for (String number : numbers) {
card.add(flower + number);
}
}
card.add("joker");
card.add("JOKER");
Collections.shuffle(card);
ArrayList<String> player1 = new ArrayList<>();
ArrayList<String> player2 = new ArrayList<>();
ArrayList<String> player3 = new ArrayList<>();
ArrayList<String> landlord = new ArrayList<>();
landlord.add(card.get(card.size()-1));
landlord.add(card.get(card.size()-2));
landlord.add(card.get(card.size()-3));
for (int i = 0; i < card.size()-3; i++) {
if(i % 3 == 0){
player1.add(card.get(i));
}else if(i % 3 == 1){
player2.add(card.get(i));
}else{
player3.add(card.get(i));
}
}
ArrayList<Character> value = new ArrayList<>();
value.add('3');
value.add('4');
value.add('5');
value.add('6');
value.add('7');
value.add('8');
value.add('9');
value.add('1');
value.add('J');
value.add('Q');
value.add('k');
value.add('A');
value.add('2');
value.add('o');
value.add('O');
Comparator<String> rule = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return value.indexOf(o1.charAt(1)) - value.indexOf(o2.charAt(1));
}
};
Collections.sort(landlord,rule);
Collections.sort(player1,rule);
Collections.sort(player2,rule);
Collections.sort(player3,rule);
System.out.println("landlord = " + landlord);
System.out.println("player1 = " + player1);
System.out.println("player2 = " + player2);
System.out.println("player3 = " + player3);
}
}
代码优化
package com.tan.comparator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class PlayingCardOptimize {
public static void main(String[] args) {
ArrayList<String> card = new ArrayList<>();
String[] flowers = {"♠","♦","♥","♣"};
String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
for (String flower : flowers) {
for (String number : numbers) {
card.add(flower + number);
}
}
card.add("joker");
card.add("JOKER");
Collections.shuffle(card);
ArrayList<String> player1 = new ArrayList<>();
ArrayList<String> player2 = new ArrayList<>();
ArrayList<String> player3 = new ArrayList<>();
ArrayList<String> landlord = new ArrayList<>();
landlord.add(card.get(card.size()-1));
landlord.add(card.get(card.size()-2));
landlord.add(card.get(card.size()-3));
for (int i = 0; i < card.size()-3; i++) {
if(i % 3 == 0){
player1.add(card.get(i));
}else if(i % 3 == 1){
player2.add(card.get(i));
}else{
player3.add(card.get(i));
}
}
ArrayList<Character> value = new ArrayList<>();
Collections.addAll(value,'3','4','5','6','7','8','9','1','J','Q','K','A','2','o','O');
Comparator<String> rule = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return value.indexOf(o1.charAt(1)) - value.indexOf(o2.charAt(1));
}
};
Collections.sort(landlord,rule);
Collections.sort(player1,rule);
Collections.sort(player2,rule);
Collections.sort(player3,rule);
System.out.println("landlord = " + landlord);
System.out.println("player1 = " + player1);
System.out.println("player2 = " + player2);
System.out.println("player3 = " + player3);
}
}