前言
斗地主——Map集合和List集合组合实现有序排序
用到了HashMap集合和ArrayList集合
一、ArrayList集合
实现不是同步的–>多线程:效率高,速度快
java.util.ArrayList
,集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList是最常用的集合。
注意:许多程序员开发时非常随意地使用ArrayList完成任何需求,并不严谨,这种用法是不提倡的。
二、HashMap集合
1.创建类
文件夹(示例):
2.读入数据
创建类Prepare
类,代码如下(示例):
package landlords2;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
/**
* 功能描述:准备牌
*
* @Author: wang
* @Date: 2022/4/23 21:59
*/
public class Prepare {
private static String[] colors = {"♥", "♣", "♦", "♠"};
private static String[] nums = {"2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3"};
//牌的Map集合
private HashMap<Integer, String> poker = new HashMap<>();
//Map集合的键的List集合
private ArrayList<Integer> keys = new ArrayList<>();
public HashMap<Integer, String> getPoker() {
return poker;
}
public ArrayList<Integer> getKey() {
return keys;
}
public void toPrepare() {
int count = 0;
poker.put(count, "大王");
keys.add(count);
count++;
poker.put(count, "小王");
keys.add(count);
count++;
for (String num : nums) {
for (String color : colors) {
poker.put(count, color + num);
keys.add(count);
count++;
}
}
//随机打乱排序
Collections.shuffle(keys);
}
}
创建Distribution
类,代码如下(示例):
package landlords2;
import java.util.*;
/**
* 功能描述:分牌
*
* @Author: wang
* @Date: 2022/4/23 22:06
*/
public class Distribution {
ArrayList<Integer> list1 = new ArrayList<>();
ArrayList<Integer> list3 = new ArrayList<>();
ArrayList<Integer> list2 = new ArrayList<>();
ArrayList<Integer> list4 = new ArrayList<>();
public ArrayList<Integer> getList1() {
return list1;
}
public ArrayList<Integer> getList2() {
return list2;
}
public ArrayList<Integer> getList3() {
return list3;
}
public ArrayList<Integer> getList4() {
return list4;
}
public void doDistribution(ArrayList<Integer> keys) {
for (int i = 0; i < keys.size() ; i++) {
if(i>=51){
Integer key = keys.get(i);
list4.add(key);
}else if(i%3==0){
Integer key = keys.get(i);
list1.add(key);
}else if(i%3==1){
Integer key = keys.get(i);
list2.add(key);
}else if(i%3==2){
Integer key = keys.get(i);
list3.add(key);
}
}
}
}
创建Show
类,代码如下(示例):
package landlords2;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
/**
* 功能描述:展示牌
*
* @Author: wang
* @Date: 2022/4/26 13:05
*/
public class Show {
public void doShow(String name,ArrayList<Integer> list,HashMap<Integer, String> poker){
list.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
}
});
System.out.print(name+":");
for (Integer k : list) {
String s = poker.get(k);
System.out.print(s+"\t");
}
System.out.println();
}
}
创建Poker
类,代码如下(示例):
package landlords2;
import java.util.ArrayList;
import java.util.HashMap;
/**
* 功能描述:斗地主洗牌发牌
*
* @Author: wang
* @Date: 2022/4/23 21:19
*/
public class Poker {
public static void main(String[] args) {
//准备牌+洗牌。
Prepare prepare = new Prepare();
prepare.toPrepare();
HashMap<Integer, String> poker = prepare.getPoker();
System.out.println(poker);
ArrayList<Integer> keys = prepare.getKey();
System.out.println("共"+keys.size()+"张牌");
System.out.println("随机排序后的索引:"+keys);
//分牌
Distribution distribution = new Distribution();
distribution.doDistribution(keys);
//展示牌
Show show = new Show();
show.doShow("玩家1",distribution.getList1(),poker);
show.doShow("玩家2",distribution.getList2(),poker);
show.doShow("玩家3",distribution.getList3(),poker);
show.doShow("底 牌",distribution.getList4(),poker);
}
}
总结
四步——准备牌,洗牌,分牌,展示牌:
- 将牌的数字和花色组合起来,再加一个0-53的键值,写入HashMap集合中,同时把0-53的键值写进一个ArrayList集合中。
- 调用Collections集合工具类里的shuffle方法将键值集合随机排序。
- 通过遍历新的键值集合将将牌分为四份分别是玩家一、玩家二、玩家三和底牌(三张),分别存进四个新的ArrayList集合中。
- 最后展示,通过遍历键值集合,通过获得的每一个键值去获取HashMap集合中对应的value的值进行打印。