0201 可变参数 collections集合常用工具类 集合嵌套 斗地主发牌器

1、可变参数

比如我们想定义一个方法去求和,但是个数不确定,首先想到的是方法重载,那也可以实现,但是是不是很麻烦呢。来看一下可变参数发方法

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

上述格式其实等价于:修饰符 返回值类型 方法名(参数类型[] 形参名){  }。底层封装了一个数组

例:代码展示

public class Demo05 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		System.out.println(add(1,2));
		System.out.println(add(1,2,3));
	}
	//计算整数和
	public static int add(int...a){
		int sum=0;
		for(int s:a){
			sum=sum+s;
		}
		return sum;
	}

}

  注:如果想在可变参数中再传其他参数,一定要方法可变参数前边,因为如果方法后边会有不确定因素产生。

2、collections集合常用工具类

(1)shuffle();用来打乱顺序的

(2)sort();排序

代码展示:

public class Demo06 {

	public static void main(String[] args) {
		List<Integer> list=new ArrayList<Integer>();
		list.add(10);
		list.add(11);
		list.add(16);
		//打乱list集合中的元素
		Collections.shuffle(list);
		System.out.println(list);
		//排序
		Collections.sort(list);
		System.out.println(list);
		
	}

}

  

3、集合嵌套

嵌套集合遍历,代码展示,四种方法

public class Work2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		HashMap<String,HashMap<Person,String>> bigmap=new HashMap<String,HashMap<Person,String>>();
		HashMap<Person, String> smap1=new HashMap<Person, String>();
		HashMap<Person, String> smap2=new HashMap<Person, String>();
		//小map存值
		smap1.put(new Person("小白",20), "学习号");
		smap1.put(new Person("小黑",21), "学习不好");
		smap2.put(new Person("小率",22), "体育号");
		smap2.put(new Person("小白",23), "垃圾");
		//想大map中存值
		bigmap.put("java1127",smap1);
		bigmap.put("java1128",smap2);
		//keyset 增强for
		//获取大map的key所在的set集合
		/*Set<String> bigset=bigmap.keySet();
		//遍历获得每一个大map的key
		for(String bigkey:bigset){
			//根据大map的key值获得小map
			HashMap<Person,String> smallmap=bigmap.get(bigkey);
			//获得小map的key所在的set集合
			Set<Person> smallset=smallmap.keySet();
			//遍历获得每一个小map的key值
			for(Person smallkey:smallset){
				//根据小map的key值获得小map的value值
				String value=smallmap.get(smallkey);
				System.out.println(bigkey+".."+smallkey+".."+value);
			}
		}*/
		//keyset 迭代器
		//获取大map的key所在的set集合
		/*Set<String> bigset=bigmap.keySet();
		//获得大map的迭代器对象
		Iterator<String> bigit=bigset.iterator();
		while(bigit.hasNext()){
			//获得大map的key值
			String bigkey=bigit.next();
			//根据大map的key值获得小map
			HashMap<Person,String> smallmap=bigmap.get(bigkey);
			//获得小map的key值所在的set集合
			Set<Person> smallset=smallmap.keySet();
			//获得小map的迭代器对象
			Iterator<Person> smallit=smallset.iterator();
			while(smallit.hasNext()){
				//获得小map的key值
				Person smallkey=smallit.next();
				//根据小map的key值获得小map的value值
				String value=smallmap.get(smallkey);
				System.out.println(bigkey+"..."+smallkey+"..."+value);
			}
		}*/
		//entryset 增强for
		//获得大map的结婚证对象所在的set集合
		/*Set<Map.Entry<String, HashMap<Person,String>>> set=bigmap.entrySet();
		//循环遍历获得大map的键值对对象
		for(Map.Entry<String, HashMap<Person,String>> bigentry:set){
			//根据键值对对象的getkey方法获得大map的key值
			String bigkey=bigentry.getKey();
			//根据大map的key、值获得小map
			HashMap<Person,String> smallmap=bigmap.get(bigkey);
			//获得小map的结婚证对象所在的set集合
			Set<Map.Entry<Person, String>> smallset=smallmap.entrySet();
			//循环遍历小map获得键值对对象
			for(Map.Entry<Person, String> smallentry:smallset){
				//根据键值对对象的getkey方法获得小map的key值
				Person smallkey=smallentry.getKey();
				//根据小map的key值获得value值
				String value=smallentry.getValue();
				System.out.println(bigkey+".."+smallkey+".."+value);
			}
		}*/
		//entryset 迭代器
		//获得大map键值对对象所在的set集合
		Set<Map.Entry<String, HashMap<Person,String>>> set=bigmap.entrySet();
		//获得大map的键值对对象的迭代器对象
		Iterator<Map.Entry<String, HashMap<Person,String>>> bigit=set.iterator();
		while(bigit.hasNext()){
			//获得大map的键值对对象
			Map.Entry<String, HashMap<Person,String>> bigentry=bigit.next();
			//根据键值对对象的方法getkey得到大map的key值
			String bigkey=bigentry.getKey();
			//根据大map中的key值获得小map
			HashMap<Person,String> smallmap=bigmap.get(bigkey);
			//获得小map键值对对象所在的set集合
			Set<Map.Entry<Person, String>> smallset=smallmap.entrySet();
			//获得小map键值对对象的迭代器对象
			Iterator<Map.Entry<Person, String>> smallit=smallset.iterator();
			while(smallit.hasNext()){
				//获得小map的键值对对象
				Map.Entry<Person, String> smallentry=smallit.next();
				//根据键值对对象的getkey方法获得小map的key值
				Person smallkey=smallentry.getKey();
				//根据小map的key值获得小map的value值
				String value=smallentry.getValue();
				System.out.println(bigkey+".."+smallkey+".."+value);
			}
		}		
	}

}

  4、斗地主发牌器

案例需求:

具体规则:

1、组装54张扑克牌

2、将54张牌顺序打乱

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

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

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

图解:

 

首先选择双列集合 Map集合作为主要存储这个54张扑克牌,key值存放的是0-53位整数,value值存的是花色和数字(花色和数字分别存放在两个数组中,经过遍历让花色和数字一一拼接)。题目中还涉及到了排序和打乱这两个要求,但是这两个需求单纯用map双列集合时很难做到的,所以要创建一个Arraylist集合存储双列集合中的key值,用Arraylist集合将其打乱和排序。然后将牌发给三维玩家和底牌,那么我们将打乱后的key值进行遍历,如果是前三张就把这三张给底牌,剩下的数与3取余如果余数为0,则给玩家1,如果余数为2,则给玩家2,如果余数为3,则发给玩家3,

代码展示:

public class Doudizhu {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		//创建装有扑克牌的map集合
		Map<Integer, String> pooker=new HashMap<Integer, String>();
		//再创建key值的arraylist集合
		List<Integer> pookernum=new ArrayList<Integer>();
		//封装花色和牌号数组
		String[] color={"♥","♣","♠","♦"};
		String[] number={"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
		//封装遍历
		int index=2;
		for(String n:number){
			for(String c:color){
				//将组合好的牌号封装到map集合中
				pooker.put(index, c+n);
				//将key封装到集合中
				pookernum.add(index);
				index++;
			}
		}
		//封装大小王
		pooker.put(0, "大王");
		pookernum.add(0);
		pooker.put(1,"小王");
		pookernum.add(1);
		//洗牌
		Collections.shuffle(pookernum);
		//创建三个玩家加底牌集合
		ArrayList<Integer> player1=new ArrayList<Integer>();
		ArrayList<Integer> player2=new ArrayList<Integer>();
		ArrayList<Integer> player3=new ArrayList<Integer>();
		ArrayList<Integer> bottom=new ArrayList<Integer>();
		//循环遍pkkoernum 所有key 发牌
		for(int i=0;i<pookernum.size();i++){
			//将前三张拍发给底牌
			if(i<3){
				bottom.add(pookernum.get(i));
			}else if(i%3==0){
				player1.add(pookernum.get(i));
			}else if(i%3==1){
				player2.add(pookernum.get(i));
			}else if(i%3==2){
				player3.add(pookernum.get(i));
			}
		}
		//排序
		Collections.sort(player1);
		Collections.sort(player2);
		Collections.sort(player3);
		Collections.sort(bottom);
		//看牌 写方法
		look("玩家1",pooker,player1);
		look("玩家2",pooker,player2);
		look("玩家3",pooker,player3);
		look("底牌",pooker,bottom);
		
	}
	public static void look(String name,Map<Integer, String> pooker,ArrayList<Integer> player1){
		//遍历渠道集合中的每一个key值
		System.out.print(name+":");
		for(int key:player1){
			System.out.print(pooker.get(key)+" ");
		}
		System.out.println();
	}

}

  

 

posted @ 2021-02-01 19:53  公雪  阅读(155)  评论(0编辑  收藏  举报