关于后端: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);

        }
    }
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理