Java集合框架(二十)——Map接口(常用方法、遍历、Entry键值对对象、自定义类型、静态导入、可变参数、Collections集合工具类、集合嵌套)、模拟斗地主洗牌发牌

目录

第一章 Map接口

1.1 Map接口概述

1.2 Map接口中常用集合概述

1.3 Map接口中的常用方法 

1.3.1 put方法

1.3.2 get方法

1.3.3  remove方法

1.4 Map集合遍历键找值方式

1.5Entry键值对对象

1.6 Map集合遍历键值对方式

1.7 HashMap存储自定义类型键值

1.8 静态导入

1.9 可变参数

1.10 Collections集合工具类

1.11 集合嵌套

第二章 模拟斗地主洗牌发牌

2.1 案例介绍

2.2 案例需求分析

2.2.1 准备牌 

2.2.2 洗牌

2.2.3 发牌

2.2.4 看牌


第一章 Map接口

 

1.1 Map接口概述

我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图。

  1. Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。
  2. Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。
  3. Collection中的集合称为单列集合,Map中的集合称为双列集合。
  4. 需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。
  5. Map中常用的集合为HashMap集合、LinkedHashMap集合。

 

1.2 Map接口中常用集合概述

通过查看Map接口描述,看到Map有多个子类,这里我们主要讲解常用的HashMap集合、LinkedHashMap集合。

  • HashMap<K,V>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
  • LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

注意:Map接口中的集合都有两个泛型变量<K,V>,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量<K,V>的数据类型可以相同,也可以不同。

 

1.3 Map接口中的常用方法 

1.3.1 put方法

 put方法:将指定的键与值对应起来,并添加到集合中

  • 方法返回值:为键所对应的值
  • 使用put方法时,若指定的键(key)在集合中没有返回null,并把指定的键值添加到集合中;
  • 使用put方法时,若指定的键(key)在集合中存在,则返回的是替换前的值,并把指定键所对应的值,替换成指定的新值。

 代码如下:

/*
	 *  将键值对存储到集合中
	 *  V put(K,V) K 作为键的对象, V作为值的对象
	 *  存储的是重复的键,将原有的值,覆盖
	 *  返回值一般情况下返回null,
	 *  存储重复键的时候,返回被覆盖之前的值
	 */
public static void function(){
		//创建集合对象,HashMap,存储对象,键是字符串,值是整数
		Map<String, Integer> map = new HashMap<String, Integer>();
		Integer m1= map.put("a", 1);
		System.out.println(m1);	//null
		map.put("b", 2);
		Integer m= map.put("b", 3);
		System.out.println(m);		//2,返回的是替换前的值
		map.put("c", 3);
		
		System.out.println(map);	//{a=1, b=3, c=3}
	}

 

1.3.2 get方法

get方法:获取指定键(key)所对应的值(value)

/*
	 * 通过键对象,获取值对象
	 * V get(K)
	 * 如果集合中没有这个键,返回null
	 */
	public static void function_1(){
		//创建集合对象,作为键的对象整数,值的对象存储字符串
		Map<Integer,String> map = new HashMap<Integer, String>();
		map.put(1, "a");
		map.put(2, "b");
		map.put(3, "c");
		System.out.println(map);	//{1=a, 2=b, 3=c}
		
		String value = map.get(4);
		System.out.println(value);	//null
		
		String value1 = map.get(2);
		System.out.println(value1);	//b
	}

 

1.3.3  remove方法

 remove方法:根据指定的键(key)删除元素,返回被删除元素的值(value)。

	/*
	 *  移除集合中的键值对,返回被移除之前的值
	 *  V remove(K)
	 */
	public static void function_2(){
		Map<Integer,String> map = new HashMap<Integer, String>();
		map.put(1, "a");
		map.put(2, "b");
		map.put(3, "c");
		System.out.println(map);	//{1=a, 2=b, 3=c}
		
		String value = map.remove(33);
		System.out.println(value);	//null
		
		String value1 = map.remove(3);
		System.out.println(value1);	//c
		
		System.out.println(map);	//{1=a, 2=b}
	}

 代码总和:

package day20.demo1;

import java.util.HashMap;
import java.util.Map;

/*
 *  Map接口中的常用方法
 *    使用Map接口的实现类 HashMap
 */
public class MapDemo {
	public static void main(String[] args) {
		function_2();
	}
	/*
	 *  移除集合中的键值对,返回被移除之前的值
	 *  V remove(K)
	 */
	public static void function_2(){
		Map<Integer,String> map = new HashMap<Integer, String>();
		map.put(1, "a");
		map.put(2, "b");
		map.put(3, "c");
		System.out.println(map);	//{1=a, 2=b, 3=c}
		
		String value = map.remove(33);
		System.out.println(value);	//null
		
		String value1 = map.remove(3);
		System.out.println(value1);	//c
		
		System.out.println(map);	//{1=a, 2=b}
	}
	
	/*
	 * 通过键对象,获取值对象
	 * V get(K)
	 * 如果集合中没有这个键,返回null
	 */
	public static void function_1(){
		//创建集合对象,作为键的对象整数,值的对象存储字符串
		Map<Integer,String> map = new HashMap<Integer, String>();
		map.put(1, "a");
		map.put(2, "b");
		map.put(3, "c");
		System.out.println(map);	//{1=a, 2=b, 3=c}
		
		String value = map.get(4);
		System.out.println(value);	//null
		
		String value1 = map.get(2);
		System.out.println(value1);	//b
	}
	
	/*
	 *  将键值对存储到集合中
	 *  V put(K,V) K 作为键的对象, V作为值的对象
	 *  存储的是重复的键,将原有的值,覆盖
	 *  返回值一般情况下返回null,
	 *  存储重复键的时候,返回被覆盖之前的值
	 */
	public static void function(){
		//创建集合对象,HashMap,存储对象,键是字符串,值是整数
		Map<String, Integer> map = new HashMap<String, Integer>();
		Integer m1= map.put("a", 1);
		System.out.println(m1);	//null
		map.put("b", 2);
		Integer m= map.put("b", 3);
		System.out.println(m);		//2
		map.put("c", 3);
		
		System.out.println(map);	//{a=1, b=3, c=3}
	}
}

 

1.4 Map集合遍历键找值方式

1.获取Map集合中所有的键

    调用Map集合的方法keySet,返回一个存储了所有的键的Set集合。

    

2.遍历Set集合,获取出Set集合中的所有元素 (Map中的键)

3. 调用Map集合方法get,通过键获取到值。

方法图解:

代码演示: 

package day20.demo1;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/*
 *  Map集合的遍历
 *    利用键获取值
 *    Map接口中定义方法keySet
 *    所有的键,存储到Set集合
 */
public class MapDemo1 {
	public static void main(String[] args) {
		/*
		 *  1. 调用map集合的方法keySet,所有的键存储到Set集合中
		 *  2. 遍历Set集合,获取出Set集合中的所有元素 (Map中的键)
		 *  3. 调用map集合方法get,通过键获取到值
		 */
		Map<String,Integer> map = new HashMap<String,Integer>();
		map.put("a", 11);
		map.put("b", 12);
		map.put("c", 13);
		map.put("d", 14);
		
		//1. 调用map集合的方法keySet,所有的键存储到Set集合中
		Set<String> set = map.keySet();
		//System.out.println(set.getClass());//返回这个类的全名,Object类,即所有类都有这个方法
		//2. 遍历Set集合,获取出Set集合中的所有元素 (Map中的键)

        //迭代器
		Iterator<String> it = set.iterator();
		while(it.hasNext()){
			//it.next返回是Set集合元素,也就是Map中的键
			//3. 调用map集合方法get,通过键获取到值
			String key = it.next();
			Integer value = map.get(key);
			System.out.println(key+"——>"+value);
		}
		System.out.println("=======================");
        
        //增强for
		for(String key : map.keySet()){
			Integer value = map.get(key);
			System.out.println(key+"——>"+value);
		}
	}
}

补充:

.getClass()返回这个类的全名,所有类都有这个方法。

$是内部类的标识 

set.getClass());//返回这个类的全名,Object类,即所有类都有这个方法
		        //class java.util.HashMap$KeySet  $是内部类的标识

 

1.5Entry键值对对象

在Map类设计时,提供了一个嵌套接口:Entry。Entry将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对(Entry)对象中获取对应的键与对应的值。

Entry是Map接口中提供的一个静态内部嵌套接口

  • getKey()方法:获取Entry对象中的键
  • getValue()方法:获取Entry对象中的值

  • entrySet()方法:用于返回Map集合中所有的键值对(Entry)对象,以Set集合形式返回。

 

1.6 Map集合遍历键值对方式

键值对方式:即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。

操作步骤与图解:

 1.获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。

    即调用map集合方法entrySet()将集合中的映射关系对象,存储到Set集合(Set<Entry <K,V> >)

        

 2.遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象

3.通过键值对(Entry)对象方法 getKet, getValue,获取Entry对象中的键与值。

        

package day20.demo1;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/*
 *  Map集合获取方式
 *  entrySet方法,键值对映射关系(结婚证)获取
 *  实现步骤:
 *    1. 调用map集合方法entrySet()将集合中的映射关系对象,存储到Set集合
 *        Set<Entry <K,V> >
 *    2. 迭代Set集合
 *    3. 获取出的Set集合的元素,是映射关系对象
 *    4. 通过映射关系对象方法 getKet, getValue获取键值对
 *    
 *    创建内部类对象 外部类.内部类 = new 
 */
public class MapDemo2 {
	public static void main(String[] args) {
		Map<Integer,String> map = new HashMap<Integer, String>();
        //HashMap<Integer,String> map = new HashMap<Integer, String>();//均可
		map.put(1, "abc");
		map.put(2, "bcd");
		map.put(3, "cde");
//		//1. 调用map集合方法entrySet()将集合中的映射关系对象,存储到Set集合
//		Set<Map.Entry <Integer,String> >  set = map.entrySet();
//		//2. 迭代Set集合
//		Iterator<Map.Entry <Integer,String> > it = set.iterator();
//		while(it.hasNext()){
//			//  3. 获取出的Set集合的元素,是映射关系对象
//			// it.next 获取的是什么对象,也是Map.Entry对象
//			Map.Entry<Integer, String> entry = it.next();
//			//4. 通过映射关系对象方法 getKet, getValue获取键值对
//			Integer key = entry.getKey();
//			String value = entry.getValue();
//			System.out.println(key+"...."+value);
//		}
		
		System.out.println("=========================");
		for(Map.Entry<Integer, String> entry : map.entrySet()){
			System.out.println(entry.getKey()+"..."+entry.getValue());
		}
	}
}

 

增强for可以遍历Map吗?

不可以,增强for遍历的是Set,通过遍历Set实现遍历Map的功能。

 

1.7 HashMap存储自定义类型键值

当给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCode和equals方法(如果忘记,请回顾HashSet存放自定义对象)。

package day20.demo1;

public class Person {
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return " [name=" + name + ", age=" + age + "]";
	}
	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	
}
package day20.demo1;
import java.util.HashMap;
import java.util.Map;

/*
 *  使用HashMap集合,存储自定义的对象
 *  自定义对象,作为键,出现,作为值出现
 */
public class HashMapDemo {
	public static void main(String[] args) {
		function_1();
	}
	/*
	 * HashMap 存储自定义对象Person,作为键出现
	 * 键的对象,是Person类型,值是字符串
	 * 保证键的唯一性,存储到键的对象,重写hashCode equals
	 */
	public static void function_1(){
		HashMap<Person, String> map = new HashMap<Person, String>();
		map.put(new Person("a",20), "里约热内卢");
		map.put(new Person("b",18), "索马里");
		map.put(new Person("b",18), "索马里");
		map.put(new Person("c",19), "百慕大");
		for(Person key : map.keySet()){
			String value = map.get(key);
			System.out.println(key+"..."+value);
		}
		System.out.println("===================");
		for(Map.Entry<Person, String> entry : map.entrySet()){
			System.out.println(entry.getKey()+"..."+entry.getValue());
		}
	}
	
	/*
	 * HashMap 存储自定义的对象Person,作为值出现
	 * 键的对象,是字符串,可以保证唯一性
	 */
	public static void function(){
		HashMap<String, Person> map = new HashMap<String, Person>();
		map.put("beijing", new Person("a",20));
		map.put("tianjin", new Person("b",18));
		map.put("shanghai", new Person("c",19));
		for(String key : map.keySet()){
			Person value = map.get(key);
			System.out.println(key+"..."+value);
		}
		System.out.println("=================");
		for(Map.Entry<String, Person> entry : map.entrySet()){
			String key = entry.getKey();
			Person value = entry.getValue();
			System.out.println(key+"..."+value);
		}
	}
}

 

如果要保证map中存放的key和取出的顺序一致,可以使用LinkedHashMap集合来存放。

 

LinkedHashMap继承HashMap。

package day20.demo1;
import java.util.LinkedHashMap;

/*
 *  LinkedHashMap继承HashMap
 *  保证迭代的顺序
 */
public class LinkedHashMapDemo {
	public static void main(String[] args) {
		LinkedHashMap<String, String> link = new LinkedHashMap<String, String>();
		link.put("1", "a");
		link.put("13", "a");
		link.put("15", "a");
		link.put("17", "a");
		System.out.println(link);
	}
}

Map接口实现类 Hashtable, Hashtable命运和Vector是一样的,从JDK1.2开始,被更先进的HashMap取代 

其底层数据结果哈希表,特点和HashMap是一样的

Hashtable与HashMap区别:
 1.  Hashtable 线程安全集合,运行速度慢
      HashMap 线程不安全的集合,运行速度快  

2.  HashMap 允许存储null值,null键
     Hashtable 不允许存储null值,null键 
 Hashtable他的孩子,子类 Properties 依然活跃在开发舞台

 

1.8 静态导入

package day20.demo1;

/*
 * JDK1.5新特性,静态导入
 * 减少开发的代码量
 * 标准的写法,导入包的时候才能使用
 * 
 * import static java.lang.System.out;最末尾,必须是一个静态成员
 */
import static java.lang.System.out;
import static java.util.Arrays.sort;


public class StaticImportDemo {
	public static void main(String[] args) {
        System.out.println("hello");
		out.println("hello");
		
		int[] arr = {1,4,2};
		sort(arr);
	}
}

 

1.9 可变参数

在JDK1.5之后,如果我们定义一个方法需要接受多个参数,并且多个参数类型一致,我们可以对其简化成如下格式:

修饰符 返回值类型 方法名(参数类型... 形参名){  }

其实这个书写完全等价与

修饰符 返回值类型 方法名(参数类型[] 形参名){  }

只是后面这种定义,在调用时必须传递数组,而前者可以直接传递数据即可。

jdk1.5以后。出现了简化操作。... 用在参数上,称之为可变参数

同样是代表数组,但是在调用这个带有可变参数的方法时,不用创建数组(这就是简单之处),直接将数组中的元素作为实际参数进行传递,其实编译成的class文件,将这些元素先封装到一个数组中,在进行传递。这些动作都在编译.class文件时,自动完成了。

可变参数的注意事项
 1. 一个方法中,可变参数只能有一个

public static int getSum(int...a,int...b)   //错误写法。若有两个,无法区分传参给哪个变量。

2. 可变参数,必须写在参数列表的最后一位

public static int getSum(int...a,int a , int b)   //错误写法。不知道是全传参给第一个还是后面的变量。 

 

package day20.demo1;

/*
 *  JDK1.5新的特性,方法的可变参数
 *  前提: 方法参数数据类型确定,参数的个数任意
 *  可变参数语法: 数据类型...变量名
 *  可变参数,本质就是一个数组
 */
public class VarArgumentsDemo {
	public static void main(String[] args) {
		//调用一个带有可变参数的方法,传递参数,可以任意
	//	getSum();
		int sum = getSum(5,34,3,56,7,8,0);
		System.out.println(sum);
		
		function(1,2,3);
	}
	/*
	 * 可变参数的注意事项
	 * 1. 一个方法中,可变参数只能有一个
	 * 2. 可变参数,必须写在参数列表的最后一位
	 */
	 public static void function(Object...o){
		 
	 }
	
	/*
	 * 定义方法,计算10个整数和
	 * 方法的可变参数实现
	 */
	public static int getSum(int...a){
		int sum = 0 ;
		for(int i : a){
			sum = sum + i;
		}
		return sum;
	}
	
	/*
	 * 定义方法,计算3个整数和
	 */
	/*public static int getSum(int a,int b ,int c){
		return a+b+c;
	}*/
	
	/*
	 * 定义方法,计算2个整数和
	 */
	/*public static int getSum(int a,int b){
		return a+b;
	}*/
}

 

1.10 Collections集合工具类

Collections是集合工具类,用来对集合进行操作。部分方法如下:

创建List集合,建议写成多态形式,利于以后开发。

List<String> list = new ArrayList<String>();
//ArrayList<String> array = new ArrayList<String>();	

/*以上两种写法均可,但建议写成多态形式,利于以后开发,因为多态可以扩展,后面的形式可以多变
  例如可写为:
    List<String> list = new LinkedList<String>();

*/
package day20.demo1;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/*
 *  集合操作的工具类
 *    Collections
 */
public class CollectionsDemo {
	public static void main(String[] args) {
		function();
	}
	/*
	 * Collections.shuffle方法
	 * 对List集合中的元素,进行随机排列
	 */
	public static void function_2(){
		List<Integer> list = new ArrayList<Integer>();
		list.add(1);
		list.add(5);
		list.add(9);
		list.add(11);
		list.add(8);
		list.add(10);
		list.add(15);
		list.add(20);	
		System.out.println(list);
		
		//调用工具类方法shuffle对集合随机排列
		Collections.shuffle(list);
		System.out.println(list);
	}
	
	/*
	 * Collections.binarySearch静态方法
	 * 对List集合进行二分搜索,方法参数,传递List集合,传递被查找的元素
	 */
	public static void function_1(){
		List<Integer> list = new ArrayList<Integer>();
		list.add(1);
		list.add(5);
		list.add(8);
		list.add(10);
		list.add(15);
		list.add(20);
		//调用工具类静态方法binarySearch
		int index = Collections.binarySearch(list, 16);
		System.out.println(index);//-6,若16存在应该在位置5,-5-1=-6
	}
	
	/*
	 *  Collections.sort静态方法
	 *  对于List集合,进行升序排列
	 */
	public static void function(){
		//创建List集合
		List<String> list = new ArrayList<String>();
		//List<String> list = new LinkedList<String>();
		//ArrayList<String> array = new ArrayList<String>();
		//建议写成多态形式,利于以后开发,因为多态可以扩展,后面的形式可以多变
		list.add("ewrew");
		list.add("qwesd");
		list.add("Qwesd");
		list.add("bv");
		list.add("wer");
		System.out.println(list);//[ewrew, qwesd, Qwesd, bv, wer]
		//调用集合工具类的方法sort
		Collections.sort(list);
		System.out.println(list);//[Qwesd, bv, ewrew, qwesd, wer] 按ASCII码排列
	}
}

 

1.11 集合嵌套

集合嵌套并不是一个新的知识点,仅仅是集合内容又是集合,如Collection集合嵌套、Collection集合与Map集合相互嵌套、Map集合嵌套。

ArrayList嵌套 ArrayList

    ArrayList< ArrayList<String> >

    Collection< ArrayList<Integer> >

Map嵌套 ArrayList

HashMap<String, ArrayList<Person>>

ArrayList< HashMap<String, String>>

Map集合嵌套

HashMap<String, HashMap<String,String>>

HashMap<String, HashMap<Person,String>>

举例:Map嵌套Map: 

package day20.demo1;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/*
 *  Map集合的嵌套,Map中存储的还是Map集合
 *  要求:
 *    传智播客  
 *      Java基础班
 *        001  张三
 *        002  李四
 *      
 *      Java就业班
 *        001  王五
 *        002  赵六
 *  对以上数据进行对象的存储
 *   001 张三  键值对
 *   Java基础班: 存储学号和姓名的键值对
 *   Java就业班:
 *   传智播客: 存储的是班级
 *   
 *   基础班Map   <学号,姓名>
 *   传智播客Map  <班级名字, 基础班Map>
 */
public class MapMapDemo {
	public static void main(String[] args) {
		//定义基础班集合
		HashMap<String, String> javase = new HashMap<String, String>();
		//定义就业班集合
		HashMap<String, String> javaee = new HashMap<String, String>();
		//向班级集合中,存储学生信息
		javase.put("001", "张三");
		javase.put("002", "李四");
		
		javaee.put("001", "王五");
		javaee.put("002", "赵六");
		//定义传智播客集合容器,键是班级名字,值是两个班级容器
		HashMap<String, HashMap<String,String>> czbk =
				new HashMap<String, HashMap<String,String>>();
		czbk.put("基础班", javase);
		czbk.put("就业班", javaee);
		
		//keySet(czbk);
		entrySet(czbk);
	}
	
	public static void entrySet(HashMap<String,HashMap<String,String>> czbk){
		//调用czbk集合方法entrySet方法,将czbk集合的键值对关系对象,存储到Set集合
		Set<Map.Entry<String, HashMap<String,String>>> 
		                         classNameSet = czbk.entrySet();
		//迭代器迭代Set集合
		Iterator<Map.Entry<String, HashMap<String,String>>> classNameIt = classNameSet.iterator();
		while(classNameIt.hasNext()){
			//classNameIt.next方法,取出的是czbk集合的键值对关系对象
			Map.Entry<String, HashMap<String,String>> classNameEntry =  classNameIt.next();
			//classNameEntry方法 getKey,getValue
			String classNameKey = classNameEntry.getKey();
			//获取值,值是一个Map集合
			HashMap<String,String> classMap = classNameEntry.getValue();
			//调用班级集合classMap方法entrySet,键值对关系对象存储Set集合
			Set<Map.Entry<String, String>> studentSet = classMap.entrySet();
			//迭代Set集合
			Iterator<Map.Entry<String, String>> studentIt = studentSet.iterator();
			while(studentIt.hasNext()){
				//studentIt方法next获取出的是班级集合的键值对关系对象
				Map.Entry<String, String> studentEntry = studentIt.next();
				//studentEntry方法 getKey getValue
				String numKey = studentEntry.getKey();
				String nameValue = studentEntry.getValue();
				System.out.println(classNameKey+".."+numKey+".."+nameValue);
			}
		}
			System.out.println("==================================");
		
		for (Map.Entry<String, HashMap<String, String>> me : czbk.entrySet()) {
			String classNameKey = me.getKey();
			HashMap<String, String> numNameMapValue = me.getValue();
			for (Map.Entry<String, String> nameMapEntry : numNameMapValue.entrySet()) {
				String numKey = nameMapEntry.getKey();
				String nameValue = nameMapEntry.getValue();
				System.out.println(classNameKey + ".." + numKey + ".." + nameValue);
			}
		}
	}
	
	public static void keySet(HashMap<String,HashMap<String,String>> czbk){
		//调用czbk集合方法keySet将键存储到Set集合
		Set<String> classNameSet = czbk.keySet();
		//迭代Set集合
		Iterator<String> classNameIt = classNameSet.iterator();
		while(classNameIt.hasNext()){
			//classNameIt.next获取出来的是Set集合元素,czbk集合的键
			String classNameKey = classNameIt.next();
			//czbk集合的方法get获取值,值是一个HashMap集合
			HashMap<String,String> classMap = czbk.get(classNameKey);
			//调用classMap集合方法keySet,键存储到Set集合
			Set<String> studentNum = classMap.keySet();
			Iterator<String> studentIt = studentNum.iterator();
	   
     	   while(studentIt.hasNext()){
				//studentIt.next获取出来的是classMap的键,学号
				String numKey = studentIt.next();
				//调用classMap集合中的get方法获取值
				String nameValue = classMap.get(numKey);
				System.out.println(classNameKey+".."+numKey+".."+nameValue);
			}
		}
		
		System.out.println("==================================");
	    for(String className: czbk.keySet()){
	       HashMap<String, String> hashMap = czbk.get(className);	
	       for(String numKey : hashMap.keySet()){
	    	   String nameValue = hashMap.get(numKey);
	    	   System.out.println(className+".."+numKey+".."+nameValue);
	       }
	    }
	}

}

 

 

第二章 模拟斗地主洗牌发牌

 

2.1 案例介绍

按照斗地主的规则,完成洗牌发牌的动作。

具体规则:

         1. 组装54张扑克牌

        2. 将54张牌顺序打乱

         3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。

         4. 查看三人各自手中的牌(按照牌的大小排序)、底牌

手中扑克牌从大到小的摆放顺序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3

 

2.2 案例需求分析

准备牌:

完成数字与纸牌的映射关系:

使用双列Map(HashMap)集合,完成一个数字与字符串纸牌的对应关系(相当于一个字典)。

洗牌:

通过数字完成洗牌发牌

发牌:

将每个人以及底牌设计为ArrayList<String>,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌。

存放的过程中要求数字大小与斗地主规则的大小对应。

将代表不同纸牌的数字分配给不同的玩家与底牌。

看牌:

通过Map集合找到对应字符展示。

通过查询纸牌与数字的对应关系,由数字转成纸牌字符串再进行展示。

 

2.2.1 准备牌 

建立map与List集合,因为只要list集合才有shuffle打乱集合的功能。

map中的key为(0-53),value为(大王,小王,♠2,♥2,....,♦3)

list集合中为0-53,代表54张牌。

//1. 组合牌
		//创建Map集合,键是编号,值是牌
		HashMap<Integer,String> pooker = new HashMap<Integer, String>();
		//创建List集合,存储编号
		ArrayList<Integer> pookerNumber = new ArrayList<Integer>();
		//定义出13个点数的数组
		String[] numbers = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
		//定义4个花色数组
		String[] colors = {"♠","♥","♣","♦"};
		//定义整数变量,作为键出现
		int index = 2;
		//遍历数组,花色+点数的组合,存储到Map集合
		for(String number : numbers){
			for(String color : colors){
				pooker.put(index, color+number);
				pookerNumber.add(index);
				index++;
			}
		}
		//存储大王,和小王
		pooker.put(0, "大王");
		pookerNumber.add(0);
		pooker.put(1, "小王");
		pookerNumber.add(1);

 

2.2.2 洗牌

调用Collections.shuffle(List)功能打乱list数组的顺序。

//洗牌,将牌的编号打乱
		Collections.shuffle(pookerNumber);

 

2.2.3 发牌

先留三张底牌,再开始发牌。将list集合的索引%3,若为0发给玩家0,若为1发给玩家1,若为2发给玩家2。

//发牌功能,将牌编号,发给玩家集合,底牌集合
		ArrayList<Integer> player1 = new ArrayList<Integer>();
		ArrayList<Integer> player2 = new ArrayList<Integer>();
		ArrayList<Integer> player3 = new ArrayList<Integer>();
		ArrayList<Integer> bottom = new ArrayList<Integer>();
		
		//发牌采用的是集合索引%3
		for(int i = 0 ; i < pookerNumber.size() ; i++){
			//先将底牌做好
			if(i < 3){
				//存到底牌去
				bottom.add( pookerNumber.get(i));
			   //对索引%3判断
			}else if(i % 3 == 0){
				//索引上的编号,发给玩家1
				player1.add( pookerNumber.get(i) );
			}else if( i % 3 == 1){
				//索引上的编号,发给玩家2
				player2.add( pookerNumber.get(i) );
			}else if( i % 3 == 2){
				//索引上的编号,发给玩家3
				player3.add( pookerNumber.get(i) );
			}
		}

2.2.4 看牌

public static void look(String name,ArrayList<Integer> player,HashMap<Integer,String> pooker){
		//遍历ArrayList集合,获取元素,作为键,到集合Map中找值
		System.out.print(name+" ");
		for(Integer key : player){
			String value = pooker.get(key);
			System.out.print(value+" ");
		}
		System.out.println();
	}

总代码: 

package day20.demo1;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;

/*
 *  实现模拟斗地主的功能
 *   1. 组合牌
 *   2. 洗牌
 *   3. 发牌
 *   4. 看牌
 */
public class DouDiZhu {
	public static void main(String[] args) {
		//1. 组合牌
		//创建Map集合,键是编号,值是牌
		HashMap<Integer,String> pooker = new HashMap<Integer, String>();
		//创建List集合,存储编号
		ArrayList<Integer> pookerNumber = new ArrayList<Integer>();
		//定义出13个点数的数组
		String[] numbers = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
		//定义4个花色数组
		String[] colors = {"♠","♥","♣","♦"};
		//定义整数变量,作为键出现
		int index = 2;
		//遍历数组,花色+点数的组合,存储到Map集合
		for(String number : numbers){
			for(String color : colors){
				pooker.put(index, color+number);
				pookerNumber.add(index);
				index++;
			}
		}
		//存储大王,和小王
		pooker.put(0, "大王");
		pookerNumber.add(0);
		pooker.put(1, "小王");
		pookerNumber.add(1);
		
		//洗牌,将牌的编号打乱
		Collections.shuffle(pookerNumber);
		
		//发牌功能,将牌编号,发给玩家集合,底牌集合
		ArrayList<Integer> player1 = new ArrayList<Integer>();
		ArrayList<Integer> player2 = new ArrayList<Integer>();
		ArrayList<Integer> player3 = new ArrayList<Integer>();
		ArrayList<Integer> bottom = new ArrayList<Integer>();
		
		//发牌采用的是集合索引%3
		for(int i = 0 ; i < pookerNumber.size() ; i++){
			//先将底牌做好
			if(i < 3){
				//存到底牌去
				bottom.add( pookerNumber.get(i));
			   //对索引%3判断
			}else if(i % 3 == 0){
				//索引上的编号,发给玩家1
				player1.add( pookerNumber.get(i) );
			}else if( i % 3 == 1){
				//索引上的编号,发给玩家2
				player2.add( pookerNumber.get(i) );
			}else if( i % 3 == 2){
				//索引上的编号,发给玩家3
				player3.add( pookerNumber.get(i) );
			}
		}
		//对玩家手中的编号排序
		Collections.sort(player1);
		Collections.sort(player2);
		Collections.sort(player3);
		//看牌,将玩家手中的编号,到Map集合中查找,根据键找值
		//定义方法实现
		look("刘德华",player1,pooker);
		look("张曼玉",player2,pooker);
		look("林青霞",player3,pooker);
		look("底牌",bottom,pooker);
	}
	public static void look(String name,ArrayList<Integer> player,HashMap<Integer,String> pooker){
		//遍历ArrayList集合,获取元素,作为键,到集合Map中找值
		System.out.print(name+" ");
		for(Integer key : player){
			String value = pooker.get(key);
			System.out.print(value+" ");
		}
		System.out.println();
	}
}

运行结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值