软件编程
位置:首页>> 软件编程>> java编程>> Java的可变参数与Collections类的功能示例解析

Java的可变参数与Collections类的功能示例解析

作者:玛拉_以琳  发布时间:2022-03-05 18:45:47 

标签: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("宜昌市");

来源:https://segmentfault.com/a/1190000043699543

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com