Map集合存储的是键值对,是一种映射关系,其中键和值是一一对应的,且键不可以重复,而值就可以。
Map接口本身是无法新建对象的,只能利用其实现类,如HashMap,LinedHashMap,去新建对象。其中HashMap是无序,即存储和取出的顺序是不一样的,比如存储a b c d ,输出时可能是b d a c.
Map父接口的方法:
public V put(K key, V value): 把指定的键与指定的值添加到Map集合中
public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值
public V get(Object key)返回到指定键所映射的值,或null如果此映射包含该键的映射。
public boolean containsKey(Object key) 判断集合中是否包含指定的键
现在我们就可以来进行模拟斗地主了,使用两个集合,一个是单列集合ArrayList,用来存储的是索引值;一个是双列集合即Map集合,其键存储索引值,和ArrayList一一对应,而value用来存储牌。
package day03;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
public class map_doudizhu {
public static void main(String[] args) {
// map集合的键用来存储索引值,value用来存储牌
HashMap<Integer, String> pocker = new HashMap<>();
// 再创建一个单列集合,用来存储索引值
ArrayList<Integer> list = new ArrayList<>();
int n=0;
pocker.put(n,"大王");
list.add(n);
n++;
pocker.put(n,"小王");
list.add(n);
String [] colors = new String[]{"♠","♣","♦","♥"};
String [] numbers = new String[]{"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
for (String color : colors) {
for (String number : numbers) {
n++;
pocker.put(n,color+number);
list.add(n);
}
}
// 现在这副牌就已经准备好了,现在来洗牌,对索引值进行打乱
Collections.shuffle(list);
// 发牌,这时创建三个玩家和一副底牌,创建的对象集合存储的是索引值
ArrayList<Integer> player01 = new ArrayList<>();
ArrayList<Integer> player02 = new ArrayList<>();
ArrayList<Integer> player03 = new ArrayList<>();
ArrayList<Integer> dipai = new ArrayList<>();
for(int i=0;i<list.size();i++){
Integer index = list.get(i);
if(i>50){
dipai.add(index);
}else if(i%3==0){
player01.add(index);
}else if(i%3==1){
player02.add(index);
}else{
player03.add(index);
}
}
// 牌已经发好,因为我们是按照索引值来取牌的,所以还可以利用这个单列集合的特点来 对牌进行排序,这里选升序
Collections.sort(player01);
Collections.sort(player02);
Collections.sort(player03);
Collections.sort(dipai);
// 接下来就是利用玩家们手里的索引值来取出map集合中对应的牌了,因为有四份牌,所以用一个函数
fapai("热 巴",pocker,player01);
fapai("周杰伦",pocker,player02);
fapai("马思纯",pocker,player03);
fapai("底 牌",pocker,dipai);
}
public static void fapai(String name,HashMap<Integer,String> map,ArrayList<Integer> list){
System.out.print("玩家名称"+"("+name+"): ");
// 根据list集合中的索引值,取出map集合中对应的value即牌
for (Integer keys : list) {
String values = map.get(keys);
System.out.print(values);
}
System.out.println();
}
}