• 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();
    	}
    
    }
    

      

  • 相关阅读:
    C#关键字operator
    .NET中各种相等
    Delphi开发能力自我评测
    Delphi7程序调用C#写的DLL解决办法
    两种类的声明方法
    delphi中 formclose的事件 action:=cafree form:=nil分别是什么意思?
    Delphi的对象注销方法Destroy和free的区别
    Delphi过程函数传递参数的几种方式
    Delphi语句、过程函数
    Delphi用Sender参数实现代码重用
  • 原文地址:https://www.cnblogs.com/-gongxue/p/14358678.html
Copyright © 2020-2023  润新知