我的编程空间,编程开发者的网络收藏夹
学习永远不晚

从零开始学习 Java:简单易懂的入门指南之可变参数及Collections类(二十五)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

从零开始学习 Java:简单易懂的入门指南之可变参数及Collections类(二十五)

可变参数及Collections类

1. 可变参数

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

格式:

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

底层:

​ 其实就是一个数组

好处:

​ 在传递数据的时候,省的我们自己创建数组并添加元素了,JDK底层帮我们自动创建数组并添加元素了

代码演示:

  public class ChangeArgs {    public static void main(String[] args) {        int sum = getSum(6, 7, 2, 12, 2121);        System.out.println(sum);    }        public static int getSum(int... arr) {   int sum = 0;        for (int a : arr) {         sum += a;        }    return sum;    }}

注意:

​ 1.一个方法只能有一个可变参数

​ 2.如果方法中有多个参数,可变参数要放到最后。

应用场景: Collections

​ 在Collections中也提供了添加一些元素方法:

public static boolean addAll(Collection c, T... elements) :往集合中添加一些元素。

代码演示:

public class CollectionsDemo {public static void main(String[] args) {      ArrayList<Integer> list = new ArrayList<Integer>();      //原来写法      //list.add(12);      //list.add(14);      //list.add(15);      //list.add(1000);      //采用工具类 完成 往集合中添加元素        Collections.addAll(list, 5, 222, 12);      System.out.println(list);}

2. Collections类

2.1 Collections常用功能

  • java.utils.Collections是集合工具类,用来对集合进行操作。

    常用方法如下:

  • public static void shuffle(List list) :打乱集合顺序。

  • public static void sort(List list):将集合中元素按照默认规则排序。

  • public static void sort(List list,Comparator ):将集合中元素按照指定规则排序。

代码演示:

public class CollectionsDemo {    public static void main(String[] args) {        ArrayList<Integer> list = new ArrayList<Integer>();           list.add(100);        list.add(300);        list.add(200);        list.add(50);        //排序方法         Collections.sort(list);        System.out.println(list);    }}结果:[50,100, 200, 300]

我们的集合按照默认的自然顺序进行了排列,如果想要指定顺序那该怎么办呢?

2.2 Comparator比较器

创建一个学生类,存储到ArrayList集合中完成指定排序操作。

Student 类

public class Student{    private String name;    private int age;//构造方法    //get/set //toString}

测试类:

public class Demo {    public static void main(String[] args) {        // 创建四个学生对象 存储到集合中        ArrayList<Student> list = new ArrayList<Student>();        list.add(new Student("rose",18));        list.add(new Student("jack",16));        list.add(new Student("abc",20));Collections.sort(list, new Comparator<Student>() {    @Override    public int compare(Student o1, Student o2) {        return o1.getAge()-o2.getAge();//以学生的年龄升序    }});        for (Student student : list) {            System.out.println(student);        }    }}Student{name='jack', age=16}Student{name='rose', age=18}Student{name='abc', age=20}

3. 综合练习

练习1:随机点名器

需求:班级里有N个学生,实现随机点名器

代码实现:

public class Test1 {    public static void main(String[] args) {                //1.定义集合        ArrayList<String> list = new ArrayList<>();        //2.添加数据        Collections.addAll(list,"范闲","范建","范统","杜子腾","杜琦燕","宋合泛","侯笼藤","朱益群","朱穆朗玛峰","袁明媛");        //3.随机点名                //打乱        Collections.shuffle(list);        String name = list.get(0);        System.out.println(name);    }}

练习2:带概率的随机

需求:

​ 班级里有N个学生

​ 要求在随机的时候,70%的概率随机到男生,30%的概率随机到女生

代码实现:

public class Test2 {    public static void main(String[] args) {                //1.创建集合        ArrayList<Integer> list = new ArrayList<>();        //2.添加数据        Collections.addAll(list,1,1,1,1,1,1,1);        Collections.addAll(list,0,0,0);        //3.打乱集合中的数据        Collections.shuffle(list);        //4.从list集合中随机抽取0或者1        Random r = new Random();        int index = r.nextInt(list.size());        int number = list.get(index);        System.out.println(number);        //5.创建两个集合分别存储男生和女生的名字        ArrayList<String> boyList = new ArrayList<>();        ArrayList<String> girlList = new ArrayList<>();        Collections.addAll(boyList,"范闲","范建","范统","杜子腾","宋合泛","侯笼藤","朱益群","朱穆朗玛峰");        Collections.addAll(girlList,"杜琦燕","袁明媛","李猜","田蜜蜜");        //6.判断此时是从boyList里面抽取还是从girlList里面抽取        if(number == 1){            //boyList            int boyIndex = r.nextInt(boyList.size());            String name = boyList.get(boyIndex);            System.out.println(name);        }else{            //girlList            int girlIndex = r.nextInt(girlList.size());            String name = girlList.get(girlIndex);            System.out.println(name);        }    }}

练习3:随机不重复

需求:

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

代码实现:

public class Test3 {    public static void main(String[] args) {               //1.定义集合        ArrayList<String> list1 = new ArrayList<>();        //2.添加数据        Collections.addAll(list1, "范闲", "范建", "范统", "杜子腾", "杜琦燕", "宋合泛", "侯笼藤", "朱益群", "朱穆朗玛峰", "袁明媛");        //创建一个临时的集合,用来存已经被点到学生的名字        ArrayList<String> list2 = new ArrayList<>();        //外循环:表示轮数        for (int i = 1; i <= 10; i++) {            System.out.println("=========第" + i + "轮点名开始了======================");            //3.获取集合的长度            int count = list1.size();            //4.随机点名            Random r = new Random();            //内循环:每一轮中随机循环抽取的过程            for (int j = 0; j < count; j++) {                int index = r.nextInt(list1.size());                String name = list1.remove(index);                list2.add(name);                System.out.println(name);            }            //此时表示一轮点名结束            //list1 空了 list2 10个学生的名字            list1.addAll(list2);            list2.clear();        }    }}

练习4:集合的嵌套

需求:

​ 定义一个Map集合,键用表示省份名称province,值表示市city,但是市会有多个。

添加完毕后,遍历结果格式如下:

​ 江苏省 = 南京市,扬州市,苏州市,无锡市,常州市

湖北省 = 武汉市,孝感市,十堰市,宜昌市,鄂州市河北省 = 石家庄市,唐山市,邢台市,保定市,张家口市

代码实现:

public class Test4 {    public static void main(String[] args) {                //1.创建Map集合        HashMap<String, ArrayList<String>> hm = new HashMap<>();        //2.创建单列集合存储市        ArrayList<String> city1 = new ArrayList<>();        city1.add("南京市");        city1.add("扬州市");        city1.add("苏州市");        city1.add("无锡市");        city1.add("常州市");        ArrayList<String> city2 = new ArrayList<>();        city2.add("武汉市");        city2.add("孝感市");        city2.add("十堰市");        city2.add("宜昌市");        city2.add("鄂州市");        ArrayList<String> city3 = new ArrayList<>();        city3.add("石家庄市");        city3.add("唐山市");        city3.add("邢台市");        city3.add("保定市");        city3.add("张家口市");        //3.把省份和多个市添加到map集合        hm.put("江苏省",city1);        hm.put("湖北省",city2);        hm.put("河北省",city3);        Set<Map.Entry<String, ArrayList<String>>> entries = hm.entrySet();        for (Map.Entry<String, ArrayList<String>> entry : entries) {            //entry依次表示每一个键值对对象            String key = entry.getKey();            ArrayList<String> value = entry.getValue();            StringJoiner sj = new StringJoiner(", ","","");            for (String city : value) {                sj.add(city);            }            System.out.println(key + " = " + sj);        }    }}

4. 斗地主发牌

4.1 案例介绍

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

使用54张牌打乱顺序,三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。

4.2 案例分析

  • 准备牌:

    牌可以设计为一个ArrayList,每个字符串为一张牌。
    每张牌由花色数字两部分组成,我们可以使用花色集合与数字集合嵌套迭代完成每张牌的组装。
    牌由Collections类的shuffle方法进行随机排序。

  • 发牌

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

  • 看牌

    直接打印每个集合。

4.3 代码实现

public class App {    public static void main(String[] args) {              //从程序的主入口开启斗地主游戏        new PokerGame();    }}public class PokerGame {    //牌盒    //♥3 ♣3    static ArrayList<String> list = new ArrayList<>();    //静态代码块    //特点:随着类的加载而在加载的,而且只执行一次。    static {        //准备牌        // "♦", "♣", "♥", "♠"        // "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"        String[] color = {"♦", "♣", "♥", "♠" };        String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};        for (String c : color) {            //c依次表示每一种花色            for (String n : number) {                //n 依次表示每一个数字                list.add(c + n);            }        }        list.add("小王");        list.add("大王");    }    public PokerGame(){        //洗牌        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++) {            //i:索引            String poker = list.get(i);            if(i <= 2){                lord.add(poker);                continue;            }            //给三个玩家轮流发牌            if(i % 3 == 0){                player1.add(poker);            }else if(i % 3 == 1){                player2.add(poker);            }else{                player3.add(poker);            }        }        //看牌        lookPoker("底牌",lord);        lookPoker("钢脑壳",player1);        lookPoker("大帅比",player2);        lookPoker("蛋筒",player3);    }        public void lookPoker(String name, ArrayList<String> list){        System.out.print(name + ": ");        for (String poker : list) {            System.out.print(poker + " ");        }        System.out.println();    }}

4.4 排序(第一种排序方式)

public class App {    public static void main(String[] args) {      //从程序的主入口开启斗地主游戏        new PokerGame();    }}public class PokerGame {    //牌盒 Map    //此时我们只要把牌跟序号产生对应关系就可以了,不需要按照序号进行排序,所以只要HashMap就可以了    static HashMap<Integer, String> hm = new HashMap<>();    static ArrayList<Integer> list = new ArrayList<>();    static {        String[] color = {"♦", "♣", "♥", "♠"};        String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};        //序号        int serialNumber = 1;        //细节        for (String n : number) {            //依次表示每一个数字            for (String c : color) {                //依次表示每一个花色                hm.put(serialNumber, c + n);                list.add(serialNumber);                serialNumber++;            }        }        hm.put(serialNumber, "小王");        list.add(serialNumber);        serialNumber++;        hm.put(serialNumber, "大王");        list.add(serialNumber);    }    public PokerGame() {        //洗牌        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++) {            //i :依次表示集合中的每一个索引            //list.get(i)元素:牌的序号            int serialNumber = list.get(i);            if(i <= 2){                lord.add(serialNumber);                continue;            }            if(i % 3 == 0){                player1.add(serialNumber);            }else if(i % 3 == 1){                player2.add(serialNumber);            }else{                player3.add(serialNumber);            }        }        //看牌        lookPoker("底牌",lord);        lookPoker("钢脑壳",player1);        lookPoker("大帅比",player2);        lookPoker("蛋筒",player3);    }        public void lookPoker(String name, TreeSet<Integer> ts){        System.out.print(name + ": ");        //遍历TreeSet集合得到每一个序号,再拿着序号到Map集合中去找真正的牌        for (int serialNumber : ts) {            String poker = hm.get(serialNumber);            System.out.print(poker + " ");        }        System.out.println();    }}

4.5 排序(第二种排序方式)

public class App {    public static void main(String[] args) {        new PokerGame();    }}public class PokerGame {    //牌盒    static ArrayList<String> list = new ArrayList<>();    //创建一个集合,用来添加牌的价值    static HashMap<String, Integer> hm = new HashMap<>();    static {        //准备牌        String[] color = {"♦", "♣", "♥", "♠"};        String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};        for (String c : color) {            for (String n : number) {                list.add(c + n);            }        }        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() {        //洗牌        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);            } else if (i % 3 == 1) {                player2.add(poker);            } else {                player3.add(poker);            }        }        //排序        order(lord);        order(player1);        order(player2);        order(player3);        //看牌        lookPoker("底牌",lord);        lookPoker("钢脑壳",player1);        lookPoker("大帅比",player2);        lookPoker("蛋筒",player3);    }        public void lookPoker(String name, ArrayList<String> list){        System.out.print(name + ": ");        for (String poker : list) {            System.out.print(poker + " ");        }        System.out.println();    }    //利用牌的价值进行排序    //参数:集合    //♥5 ♥3 ♥6 ♥7 ♥9    public void order(ArrayList<String> list){        Collections.sort(list, new Comparator<String>() {            //Array.sort (插入排序 + 二分查找)            @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的价值    ♥3  ♠3                int i = value1 - value2;                return i == 0 ? color1.compareTo(color2) : i;            }        });    }    //计算牌的价值    //参数:牌    //返回值:价值    public int getValue(String poker){//♥3        //获取牌上的数字        String number = poker.substring(1);//把这里截取出来的结果,让这个结果再Map集合中存在 “ 大王”        //拿着数字到map集合中判断是否存在        if(hm.containsKey(number)){            //存在,获取价值            return hm.get(number);        }else{            //不存在,类型转换            return Integer.parseInt(number);        }    }}

后记
👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹

来源地址:https://blog.csdn.net/m0_59230408/article/details/132247012

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

从零开始学习 Java:简单易懂的入门指南之可变参数及Collections类(二十五)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

从零开始学习 Java:简单易懂的入门指南之MAth、System(十二)

常见API,MAth、System 1 Math类1.1 概述1.2 常见方法1.3 算法小题(质数)1.4 算法小题(自幂数) 2 System类2.1 概述2.2 常见方法 1 Math类 1.1 概述 tips
2023-08-18

从零开始学习 Java:简单易懂的入门指南(二)

Java基础语法 1. 注释1.1使用的技巧1.2注意点 2. 关键字2.1 概念2.2 第一个关键字class 3. 字面量3.1区分技巧 4. 变量4.1 什么是变量?4.2 变量的定义格式4.2.1 格式详解
2023-08-19

从零开始学习 Java:简单易懂的入门指南之时间类(十七)

时间类 第一章 Date类1.1 Date概述1.2 Date常用方法 第二章 SimpleDateFormat类2.1 构造方法2.2 格式规则2.3 常用方法2.4 练习1(初恋女友的出生日期)2.5 练习2(秒杀活动)
2023-08-30

从零开始学习 Java:简单易懂的入门指南之爬虫(十六)

爬虫 1.1 本地数据爬取1.2 网络数据爬取1.3 爬取数据练习1.4 按要求爬取1.5 贪婪爬取和非贪婪爬取1.6 String的split方法中使用正则表达式1.7 String类的replaceAll方法中使用正则表达式1.
2023-08-25

从零开始学习 Java:简单易懂的入门指南之正则表达式(十五)

正则表达式 1.1 正则表达式的概念及演示1.2 正则表达式-字符类1.3 正则表达式-逻辑运算符1.4 正则表达式-预定义字符1.5 正则表达式-数量词1.6 正则表达式练习11.7 正则表达式练习2 1.1 正则表达式的
2023-08-22

从零开始学习 Java:简单易懂的入门指南(三)

java基础知识 1.运算符和表达式运算符:表达式: 2.算术运算符练习:数值拆分 3.隐式转换概念:简单记忆:两种提升规则:取值范围从小到大的关系: 4.隐式转换的练习案例一:案例二:案例三:案例四:
2023-08-16

从零开始学习 Java:简单易懂的入门指南(一)

Java基础语法 1. 人机交互1.1 什么是cmd?1.2 如何打开CMD窗口?1.3 常用CMD命令1.4 CMD练习1.5 环境变量 2. Java概述1.1 Java是什么?1.2下载和安装1.2.1 下载1.2.2
2023-08-16

从零开始学习 Java:简单易懂的入门指南之API、String类(八)

常用API 1.API1.1API概述1.2如何使用API帮助文档 2.String类2.1String类概述2.2String类的特点2.3String类的构造方法2.4创建字符串对象两种方式的区别2.5字符串的比较2.5.
2023-08-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录