乐趣区

关于后端:Java-的可变参数与-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 <T> boolean addAll(Collection<T> 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, 1,2);
      System.out.println(list);
}

2. Collections 类

2.1 Collections 罕用性能

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

    罕用办法如下:

  • public static void shuffle(List<?> list) : 打乱汇合程序。
  • public static <T> void sort(List<T> list): 将汇合中元素依照默认规定排序。
  • public static <T> void sort(List<T> list,Comparator<? super T>): 将汇合中元素依照指定规定排序。

代码演示:

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) {
        /* 班级里有 N 个学生,学生属性: 姓名,年龄,性别。实现随机点名器。*/


        //1. 定义汇合
        ArrayList<String> list = new ArrayList<>();
        //2. 增加数据
        Collections.addAll(list,"范闲","范建","范统","杜子腾","杜琦燕","宋合泛","侯笼藤","朱益群","朱穆朗玛峰","袁明媛");
        //3. 随机点名
        /* Random r = new Random();
        int index = r.nextInt(list.size());
        String name = list.get(index);
        System.out.println(name);*/

        // 打乱
        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) {
        /* 班级里有 N 个学生
        要求:70% 的概率随机到男生
        30% 的概率随机到女生

        "范闲","范建","范统","杜子腾","宋合泛","侯笼藤","朱益群","朱穆朗玛峰",
        "杜琦燕","袁明媛","李猜","田蜜蜜",
        */
        //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) {
       /* 班级里有 5 个学生
        要求:被点到的学生不会再被点到。然而如果班级中所有的学生都点完了,须要从新开启第二轮点名。*/


        //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) {
        /* 需要
        定义一个 Map 汇合,键用示意省份名称 province,值示意市 city,然而市会有多个。增加结束后,遍历后果格局如下:江苏省 = 南京市,扬州市,苏州市,无锡市,常州市
                湖北省 = 武汉市,孝感市,十堰市,宜昌市,鄂州市
                河北省 = 石家庄市,唐山市,邢台市,保定市,张家口市 */


        //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);

        }
    }
}
退出移动版