JAVA 集合进阶

可变参数

例如

package args;

public class argsDemo1 {
    public static void main(String[] args) {

        //JDK5
        //可变参数
        //方法形参的个数是可以发生变化的,0 1 2 3 ...
        //格式:属性类型...名字
        //int...args

        int sum=getsum(1,2,3,4,5,6,7,8,9,10);
        System.out.println(sum);
    }

    //底层:
    //可变参数的底层就是一个数组
    //只不过不需要我们自己创建了,Java会帮我们创建好
    public static int getsum(int... args){
        int sum=0;
        for(int i:args){
            sum+=i;
        }
        return sum;
    }
}

可变参数的小细节:
1.在方法的形参中最多只能写一个可变参数
可变参数,理解为一个大胖子,有多少吃多少
2.在方法的形参当中,如果出了可变参数以外,还有其他的形参,那么可变参数要写在最后

Collections

 

package mycollections;

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

public class CollectionsDemo1 {
    public static void main(String[] args) {

        //addAll 批量添加元素
        //1.创建集合对象
        ArrayList<String> list = new ArrayList<>();
        //2.批量添加元素
        Collections.addAll(list,"abc","1234","qwer","zxcv","asdf");
        //3.打印集合
        System.out.println(list);

        //shuffle 打乱集合元素
        Collections.shuffle(list);
        System.out.println(list);
    }
}

习题

1.班里有n个学生,实现随机点名

package a06test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

public class Test1 {
    public static void main(String[] args) {
        //1.定义集合
        ArrayList<String> list = new ArrayList<>();
        //2.添加元素
        Collections.addAll(list, "a", "b", "c", "d", "e");

        //(1)
        //3.打乱集合
        Collections.shuffle(list);
        //4.输出
        System.out.println(list.get(0));

        //(2)
        //打乱
        Random r = new Random();
        int index=r.nextInt(list.size());
        System.out.println(list.get(index));
    }
}

2.班级里有N个学生
要求:
70%的概率随机到男生
30%的概率随机到女生

扫描二维码关注公众号,回复: 17624514 查看本文章
package a06test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

public class Test2 {
    public static void main(String[] args) {
        Random r=new Random();
        int index=r.nextInt(10);
        ArrayList<String> boylist=new ArrayList();
        ArrayList<String> girllist=new ArrayList();
        Collections.addAll(boylist,"张无忌");
        Collections.addAll(girllist,"张三丰");

        if(index<7){
            int boyindex=r.nextInt(boylist.size());
            String boyname=boylist.get(boyindex);
            System.out.println("恭喜你,你是"+boyname);
        }else{
            int girlindex=r.nextInt(girllist.size());
            String girlname=girllist.get(girlindex);
            System.out.println("恭喜你,你是"+girlname);
        }
    }
}

3.
班级里有N个学生
要求:
被点到的学生不会再被点到。
但是如果班级中所有的学生都点完了,需要重新开启第二轮点名, 

package a06test;

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

public class Test3 {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            //1.创建集合对象
            ArrayList<String> list = new ArrayList<>();
            //2.添加元素
            Collections.addAll(list, "1", "2", "3", "4", "5");
            //3.打乱集合元素顺序
            Collections.shuffle(list);
            //4.输出
            for (int j = 0; j < list.size(); j++) {
                System.out.println(list.get(j));
            }
            System.out.println("------------------");
        }
    }
}

阶段项目:斗地主

排序

1.如果原始数据的规律非常复杂,我们可以先手动排序让每一个数据跟唯一的序号产生对应关系。
序号就是数字,规律非常简单,后续的所有操作,我们以序号为准
当真正需要操作原始数据时候,再通过序号找到原始数据即可。

package doudizhu2;

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

public class PokerGame {

        //牌盒(静态只能访问静态)
        //此时我们只需要把牌和序号产生对应关系就可以了,不需要按照序号进行排序,所以只要HashMap即可
        //我们要对谁进行操作,就让谁当键
        static HashMap<Integer,String> hm=new HashMap<>();
        static ArrayList<Integer> list=new ArrayList<>();

        //静态代码块
        //特点:随着类的加载而加载,只加载一次,优先于主函数执行
        static{
            //准备牌
            String[] colors={"♦","♣","♥","♠"};
            String[] numbers={"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
            int serialNumber=1;
            //依次表示灭一个数字
            for(String number:numbers){
                //依次表示每一个花色
                for(String color:colors){
                    hm.put(serialNumber,color+number);
                    list.add(serialNumber);
                    serialNumber++;
                }
            }
            //添加大小王
            hm.put(serialNumber,"小王");
            list.add(serialNumber);
            serialNumber++;
            hm.put(serialNumber,"大王");
            list.add(serialNumber);
        }

        //构造函数
        public PokerGame(){
            //System.out.println(list);
            //洗牌
            Collections.shuffle(list);
            //发牌
            TreeSet<Integer> lord=new TreeSet<>();
            TreeSet<Integer> player1=new TreeSet<>();
            TreeSet<Integer> player2=new TreeSet<>();
            TreeSet<Integer> player3=new TreeSet<>();
            for(int i=0;i<list.size();i++){
                    int serialNumber=list.get(i);
                    if(i<=2){
                        lord.add(serialNumber);
                        continue;
                    }
                    if(i%3==0){
                        player1.add(serialNumber);
                    }
                    if(i%3==1){
                        player2.add(serialNumber);
                    }
                    if(i%3==2){
                        player3.add(serialNumber);
                    }
            }
            //看牌
            lookPoker("底牌",lord);
            lookPoker("玩家1",player1);
            lookPoker("玩家2",player2);
            lookPoker("玩家3",player3);
        }
        public static void lookPoker(String name,TreeSet<Integer> ts){
            System.out.print(name+"的牌是:");
            for(int serialNumber:ts){
                String poker=hm.get(serialNumber);
                System.out.print(poker+" ");
            }
            System.out.println();
        }
}

2.给每一张牌计算价值,并排序

package doudizhu3;

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

public class PokerGame {

        //牌盒(静态只能访问静态)
        static ArrayList<String> list=new ArrayList<>();

        //创建一个集合,用来添加牌的价值
        static HashMap<String,Integer> hm=new HashMap<>();
        //静态代码块
        //特点:随着类的加载而加载,只加载一次,优先于主函数执行
        static{
            //准备牌
            String[] colors={"♠","♥","♣","♦"};
            String[] numbers={"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
            for(String color:colors){
                for(String number:numbers){
                    list.add(color+number);
                }
            }
            //添加大小王
            list.add(" 小王");
            list.add(" 大王");

            //添加价值
            //牌上的数字到map集合中判断是否存在
            //存在,获取价值
            //不存在,本身的数字就是价值
            hm.put("J",11);
            hm.put("Q",12);
            hm.put("K",13);
            hm.put("A",14);
            hm.put("2",15);
            hm.put("小王",50);
            hm.put("大王",100);
        }

        //构造函数
        public PokerGame(){
            //System.out.println(list);
            //洗牌
            Collections.shuffle(list);
            //发牌
            ArrayList<String> lord=new ArrayList();
            ArrayList<String> player1=new ArrayList<>();
            ArrayList<String> player2=new ArrayList<>();
            ArrayList<String> player3=new ArrayList<>();
            for(int i=0;i<list.size();i++){
                    String poker=list.get(i);
                    if(i<=2){
                        lord.add(poker);
                        continue;
                    }
                    if(i%3==0){
                        player1.add(poker);
                    }
                    if(i%3==1){
                        player2.add(poker);
                    }
                    if(i%3==2){
                        player3.add(poker);
                    }
            }

            //排序
            order(lord);
            order(player1);
            order(player2);
            order(player3);

            //看牌
            lookPoker("底牌",lord);
            lookPoker("玩家1",player1);
            lookPoker("玩家2",player2);
            lookPoker("玩家3",player3);
        }

        //利用牌的价值进行排序
        //参数:集合
        public void order(ArrayList<String> list){
                Collections.sort(list,new Comparator<String>(){
                    @Override
                    public int compare(String o1, String o2) {
                        //o1:表示现在要插入到有序序列中的牌
                        //o2:表示已经存在在有序序列中的牌

                        //负数:o1小 插入到前面
                        //正数:o1大 插入到后面
                        //0:o1和o2的数字是一样的 需要按照花色进行排序
                        //1.计算o1的花色和价值
                        String color1=o1.substring(0,1);
                        int value1=getValue(o1);

                        //2.计算o2的花色和价值
                        String color2=o2.substring(0,1);
                        int value2=getValue(o2);

                        //3.比较o1和o2的价值
                        int i=value1-value2;
                        return i==0?color1.compareTo(color2):i;
                    }
                });
        }

        //计算牌的价值
        //参数:牌
        //返回值:牌的价值
        public int getValue(String poker){
            //1.截取数字
            String number=poker.substring(1);
            //2.判断数字是否存在
            if(hm.containsKey(number)){
                //存在
                return hm.get(number);
            }else{
                //不存在
                return Integer.parseInt(number);
            }
        }

        public static void lookPoker(String name,ArrayList<String> list){
            System.out.print(name+"的牌是:");
            for(String poker:list){
                System.out.print(poker+" ");
            }
            System.out.println();
        }
}