Java 的可變引數與 Collections 類

瑪拉_以琳發表於2023-04-26

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

        }
    }
}

相關文章