详解 Collections类
(请关注 本人“集合总集篇”博文——《详解 集合框架》)
有的同学可能会有这样的疑问 —— Collections类也是集合吗?
答曰:非也!
那为什么要讲解这个类呢?
答曰:此类为 针对集合操作 的工具类
Collections类:
概念:
针对集合操作 的工具类
首先,本人来展示下 这个类的API:
- 构造方法:
- static List EMPTY_LIST :
空的列表(不可变的)- static Map EMPTY_MAP
空的映射(不可变的)- static Set EMPTY_SET
空的 set(不可变的)
- 常用API:
- public static < T > void sort(List< T > list):
排序,默认按照自然顺序- public static < T > int binarySearch(List<?> list,T key):
二分查找- public static < T > T max(Collection<?> coll):
获取最大值- public static void reverse(List<?> list):
反转- public static void shuffle(List<?> list):
随机置换
可以看到,本人列举的常用API都是关于List的操作,这是因为List存储的数据都是有序的,而且是单列的,所以需要的操作就更灵活些。即便是双列的Map,在一定程度上也可以拆成单列的List(因为对于Map的操作,主要是针对“键元素”)
那么,本人在这里来讲解一个很有趣的例子 —— 模拟斗地主 的 洗牌和发牌 操作:
本人先来说明一下规则:
规则:
- 一共三个玩家
- 每个玩家按照顺序依次抽取扑克牌,没人总共抽取17张
- 剩余3张扑克牌作为底牌,由“地主”收取
由于本例仅展示发牌和看牌的操作,所以,大致操作流程如下:
- 将54张扑克牌依次存储一个ArrayList中(装进牌盒子)
- 打乱这54张扑克牌(洗牌)
- 按顺序给三个TreeSet依次发牌,并留三张牌存入另一个TreeSet中(发牌、理牌)
- 遍历这四个TreeSet(看牌)
现在,本人根据上面的讲解上代码:
首先,本人给出一个理牌器:
package about_collections;
import java.util.Comparator;
public class PokerSorter implements Comparator<String> {
public PokerSorter() {
}
@Override
public int compare(String poker1, String poker2) {
if(poker2.equals("☀")
|| (!poker1.equals("☀") && poker2.equals("🌙"))) {
return -1;
} else if (poker1.equals("☀") || poker1.equals("🌙")) {
return 1;
}
int value1 = getValue(poker1);
int value2 = getValue(poker2);
int res = value1 - value2;
if (res == 0) {
String color1 = poker1.substring(0, 1);
String color2 = poker2.substring(0, 1);
res = dealValueSame(color1, color2);
}
return res;
}
private int dealValueSame(String color1, String color2) {
if (color1.equals("♣")) {
return 1;
} else if (color1.equals("♥")
|| (color1.equals("♠") && color2.equals("♣"))
|| ((color1.equals("♦") && !color2.equals("♥")))) {
return -1;
}
return 1;
}
private int getValue(String poker) {
if (poker.substring(1).equals("A")) {
return 1;
} else if (poker.substring(1).equals("J")) {
return 11;
} else if (poker.substring(1).equals("Q")) {
return 12;
} else if (poker.substring(1).equals("K")) {
return 13;
} else {
return Integer.valueOf(poker.substring(1));
}
}
}
现在,本人来编写下实现这个游戏:
package about_collections;
import java.util.ArrayList;
import java.util.Collections;
import java.util.TreeSet;
public class PokerGame {
public static void main(String[] args) {
//斗地主: 发牌 理牌 看牌
/* 创建牌盒子 */
ArrayList<String> pokerBox = new ArrayList<>();
/* 生成牌 装进牌盒子 */
String[] colos = {"♥", "♠", "♦", "♣"};
String[] nums = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
for (String color : colos) {
for (String num : nums) {
String poker = color.concat(num);
pokerBox.add(poker);
}
}
/* 手动添加大小王 */
pokerBox.add("🌙"); //假设🌙代表小王
pokerBox.add("☀"); //假设☀代表小王
/* 洗牌 */
Collections.shuffle(pokerBox); //随机打乱集合中元素的顺序
/* 发牌、理牌 */
//三个人,对应三个集合 底牌也是个集合
//三个人 一人17张牌一副牌, 还有三张底牌
TreeSet<String> gaoJin = new TreeSet<String>(new PokerSorter());
TreeSet<String> chenDaoZai = new TreeSet<String>(new PokerSorter());
TreeSet<String> zhouXingXing = new TreeSet<String>(new PokerSorter());
TreeSet<String> lastPokers = new TreeSet<String>(new PokerSorter());
//发牌的顺序:
//高进 0 3 6 9 ... ...
//陈刀仔 1 4 7 10 ... ...
//周星星 2 5 8 11 ... ...
for (int i = 0; i < pokerBox.size(); i++) {
if(i>=pokerBox.size()-3){
lastPokers.add(pokerBox.get(i));
}else if(i%3==0){
gaoJin.add(pokerBox.get(i));
} else if (i % 3 == 1) {
chenDaoZai.add(pokerBox.get(i));
}else {
zhouXingXing.add(pokerBox.get(i));
}
}
/* 看牌 */
lookPoker("高进", gaoJin);
lookPoker("陈刀仔", chenDaoZai);
lookPoker("周星星", zhouXingXing);
lookPoker("底牌", lastPokers);
}
private static void lookPoker(String name, TreeSet<String> treeSet) {
System.out.println(name);
for (String poker : treeSet) {
System.out.print(poker + "\t");
}
System.out.println();
}
}
那么,本人来展示下运行结果:
可以看到,斗地主的发牌、理牌、看牌步骤实现完成!
(集合总集篇链接:https:////www.cnblogs.com/codderYouzg/p/12416560.html)