代码:
package day18_Poker;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;
/*
* 模拟斗地主洗牌和发牌
*
* 分析:
* A:创建一个牌盒
* B:装牌
* C:洗牌
* D:发牌
* E:看牌
* 思路:
* A:创建一个HashMap集合
* B:创建一个ArrayList集合
* C:创建花色数组和点数数组
* D:从0开始往HashMap里面存储编号,并存储对应的牌
* 同时从ArrayList里面存储编号即可
* E:洗牌(洗的是编号)
* F:发牌(发的也是编号,为了保证编号是排序,就创建TreeSet集合接收)
* G:看牌(遍历TreeSet集合,获取编号,到HashMap集合照对应的牌)
* */
public class PokerDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建HashMap集合
HashMap<Integer, String> hm = new HashMap<Integer,String>();
//创建一个ArrayList集合
ArrayList<Integer> array = new ArrayList<Integer>();
//创建花色数组和点数数组
String[] colors={"♠","♥","♣","♦"};
String[] numbers={"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
//从0开始往HashMap里面存储编号,并存储对应的牌
int index=0;
for(String number:numbers){
for(String color:colors){
String poker=color.concat(number);
//放入HashMap
hm.put(index, poker);//对应左侧HashMap图
array.add(index);//对应右侧Array图
index++;
}
}
//放大小王
hm.put(index, "小王");
array.add(index);
index++;//放入元素加1
hm.put(index, "大王");
array.add(index);
//洗牌(洗的是编号)
Collections.shuffle(array);
//F:发牌(发的也是编号,为了保证编号是排序,就创建TreeSet集合接收)
TreeSet<Integer> fengQingYang = new TreeSet<Integer>();
TreeSet<Integer> linQingXia = new TreeSet<Integer>();
TreeSet<Integer> liuYi = new TreeSet<Integer>();
TreeSet<Integer> diPai = new TreeSet<Integer>();
//发牌
for(int i=0;i<array.size();i++){
if(i>=array.size()-3){
diPai.add(i);
}else if(i%3==0){
fengQingYang.add(i);
}else if(i%3==1){
linQingXia.add(i);
}else if(i%3==2){
liuYi.add(i);
}
}
//看牌(遍历TreeSet集合,获取编号,到HashMap集合照对应的牌)
lookPoker("风清扬", fengQingYang, hm);
lookPoker("林青霞", linQingXia, hm);
lookPoker("刘意", liuYi, hm);
lookPoker("底牌", diPai, hm);
}
public static void lookPoker(String name,TreeSet<Integer> ts,HashMap<Integer, String>hm){
System.out.println(name+"的牌是:");
for(Integer key:ts){
String value=hm.get(key);
System.out.print(value+" ");
}
System.out.println();
}
}
三者总结:
1.集合(自己补齐)
Collection(单列集合)
List(有序,可重复)
ArrayList
底层数据结构是数组,查询块,增删慢
线程不安全,效率高
Vector
底层数据结构是数组,查询块,增删慢
线程安全,效率低
LinkedList
底层数据结构是链表,查询慢,增删块
线程不安全,效率高
Set(无序,不可重复)
HashSet
底层数据结构是哈希表
哈希表依赖两个方法:hashCode()和equals()
执行顺序:
首先判断hashCode()值是否相同
是:继续执行equals()方法,看其返回值
true:说明元素重复,不添加
false:就直接添加
否:直接添加
最终:
自动生成hashCode()和equals()即可。alt+shift
LinkedHashSet
底层数据结构由链表和哈希表组成。
有链表保证元素有序
由哈希表保证唯一
TreeSet
底层数据结构是红黑树。(是一种自平衡的二叉树)
如何保证元素唯一性?
根据比较的返回值是否是0来决定
如何保证元素的排序?
自然排序(元素具备比较性)
让元素所属的类实现Comparatable接口
比较器排序(集合具备比较性)
让集合接收一个Comparator的实现类对象
Map(双列集合)
Map集合的数据结构仅仅针对键有效,与值无关
A:Map集合的数据结构仅仅针对键有效,与值无关
B:存储的是键值对形式的元素,键唯一,值可以
HashMap
底层数据结构是哈希表
哈希表依赖两个方法:hashCode()和equals()
执行顺序:
首先判断hashCode()值是否相同
是:继续执行equals()方法,看其返回值
true:说明元素重复,不添加
false:就直接添加
否:直接添加
最终:
自动生成hashCode()和equals()即可。alt+shift
LinkedHashMap
底层数据结构由链表和哈希表组成。
有链表保证元素有序
由哈希表保证唯一
Hashtable
底层数据结构是哈希表
哈希表依赖两个方法:hashCode()和equals()
执行顺序:
首先判断hashCode()值是否相同
是:继续执行equals()方法,看其返回值
true:说明元素重复,不添加
false:就直接添加
否:直接添加
最终:
自动生成hashCode()和equals()即可。alt+shift
TreeMap
底层数据结构是红黑树。(是一种自平衡的二叉树)
如何保证元素唯一性?
根据比较的返回值是否是0来决定
如何保证元素的排序?
自然排序(元素具备比较性)
让元素所属的类实现Comparatable接口
比较器排序(集合具备比较性)
让集合接收一个Comparator的实现类对象
2:到底使用那种集合(自己补齐)
看需求:
是否是键值对形式:
是: Map
键是否需要排序:
是:TreeMap
否:HashMap
不知道,就使用HashMap
否:Collection
元素是否唯一?
是:Set
元素是否需要排序
是:TreeSet
否:HashSet
不知道,就使用HashSet
否:List
要安全吗?
是:Vector(其实我们也不用,后面我们讲解了多线程以后,再回顾)
否:ArrayList或者LinkedList
增删多:LinkedList
查询多:ArrayList
不知道,就是用ArrayList
不知道,就使用ArrayList
3:集合的常见方法及便利方式
Collection:
add()
remove()
contains()
iterator()
size()
遍历:
增强for
迭代器
|--List
get()
遍历:
普通for
|--Set
Map:
put()
remove()
containsKey(),containsValue()
keySet()
get()
value()
entrySet()
size()
遍历:
根据键找值
根据键值对对象分别找键和值