国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

從零開(kāi)始學(xué)習(xí) Java:簡(jiǎn)單易懂的入門指南之可變參數(shù)及Collections類(二十五)

這篇具有很好參考價(jià)值的文章主要介紹了從零開(kāi)始學(xué)習(xí) Java:簡(jiǎn)單易懂的入門指南之可變參數(shù)及Collections類(二十五)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1. 可變參數(shù)

JDK1.5之后,如果我們定義一個(gè)方法需要接受多個(gè)參數(shù),并且多個(gè)參數(shù)類型一致,我們可以對(duì)其簡(jiǎn)化.

格式:

修飾符 返回值類型 方法名(參數(shù)類型... 形參名){  }

底層:

? 其實(shí)就是一個(gè)數(shù)組

好處:

? 在傳遞數(shù)據(jù)的時(shí)候,省的我們自己創(chuàng)建數(shù)組并添加元素了,JDK底層幫我們自動(dòng)創(chuàng)建數(shù)組并添加元素了

代碼演示:

  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.一個(gè)方法只能有一個(gè)可變參數(shù)

? 2.如果方法中有多個(gè)參數(shù),可變參數(shù)要放到最后。

應(yīng)用場(chǎng)景: 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>();
      //原來(lái)寫法
      //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是集合工具類,用來(lái)對(duì)集合進(jìn)行操作。

    常用方法如下:

  • public static void shuffle(List<?> list) :打亂集合順序。

  • public static <T> void sort(List<T> list):將集合中元素按照默認(rèn)規(guī)則排序。

  • public static <T> void sort(List<T> list,Comparator<? super T> ):將集合中元素按照指定規(guī)則排序。

代碼演示:

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);
    }
}
結(jié)果:
[50,100, 200, 300]

我們的集合按照默認(rèn)的自然順序進(jìn)行了排列,如果想要指定順序那該怎么辦呢?

2.2 Comparator比較器

創(chuàng)建一個(gè)學(xué)生類,存儲(chǔ)到ArrayList集合中完成指定排序操作。

Student 類

public class Student{
    private String name;
    private int age;
	//構(gòu)造方法
    //get/set
 	//toString
}

測(cè)試類:

public class Demo {
    public static void main(String[] args) {
        // 創(chuàng)建四個(gè)學(xué)生對(duì)象 存儲(chǔ)到集合中
        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();//以學(xué)生的年齡升序
   		 }
		});


        for (Student student : list) {
            System.out.println(student);
        }
    }
}
Student{name='jack', age=16}
Student{name='rose', age=18}
Student{name='abc', age=20}

3. 綜合練習(xí)

練習(xí)1:隨機(jī)點(diǎn)名器

需求:班級(jí)里有N個(gè)學(xué)生,實(shí)現(xiàn)隨機(jī)點(diǎn)名器

代碼實(shí)現(xiàn):

public class Test1 {
    public static void main(String[] args) {
        /* 班級(jí)里有N個(gè)學(xué)生,學(xué)生屬性:姓名,年齡,性別。
        實(shí)現(xiàn)隨機(jī)點(diǎn)名器。*/


        //1.定義集合
        ArrayList<String> list = new ArrayList<>();
        //2.添加數(shù)據(jù)
        Collections.addAll(list,"范閑","范建","范統(tǒng)","杜子騰","杜琦燕","宋合泛","侯籠藤","朱益群","朱穆朗瑪峰","袁明媛");
        //3.隨機(jī)點(diǎn)名
        /* 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);


    }
}

練習(xí)2:帶概率的隨機(jī)

需求:

? 班級(jí)里有N個(gè)學(xué)生

? 要求在隨機(jī)的時(shí)候,70%的概率隨機(jī)到男生,30%的概率隨機(jī)到女生

代碼實(shí)現(xiàn):

public class Test2 {
    public static void main(String[] args) {
        /* 班級(jí)里有N個(gè)學(xué)生
        要求:
        70%的概率隨機(jī)到男生
        30%的概率隨機(jī)到女生

        "范閑","范建","范統(tǒng)","杜子騰","宋合泛","侯籠藤","朱益群","朱穆朗瑪峰",
        "杜琦燕","袁明媛","李猜","田蜜蜜",
        */
        //1.創(chuàng)建集合
        ArrayList<Integer> list = new ArrayList<>();
        //2.添加數(shù)據(jù)
        Collections.addAll(list,1,1,1,1,1,1,1);
        Collections.addAll(list,0,0,0);
        //3.打亂集合中的數(shù)據(jù)
        Collections.shuffle(list);
        //4.從list集合中隨機(jī)抽取0或者1
        Random r = new Random();
        int index = r.nextInt(list.size());
        int number = list.get(index);
        System.out.println(number);
        //5.創(chuàng)建兩個(gè)集合分別存儲(chǔ)男生和女生的名字
        ArrayList<String> boyList = new ArrayList<>();
        ArrayList<String> girlList = new ArrayList<>();

        Collections.addAll(boyList,"范閑","范建","范統(tǒng)","杜子騰","宋合泛","侯籠藤","朱益群","朱穆朗瑪峰");
        Collections.addAll(girlList,"杜琦燕","袁明媛","李猜","田蜜蜜");

        //6.判斷此時(shí)是從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);
        }


    }
}

練習(xí)3:隨機(jī)不重復(fù)

需求:

? 班級(jí)里有N個(gè)學(xué)生,被點(diǎn)到的學(xué)生不會(huì)再被點(diǎn)到。但是如果班級(jí)中所有的學(xué)生都點(diǎn)完了, 需要重新開(kāi)啟第二輪點(diǎn)名。

代碼實(shí)現(xiàn):

public class Test3 {
    public static void main(String[] args) {
       /* 班級(jí)里有5個(gè)學(xué)生
        要求:
        被點(diǎn)到的學(xué)生不會(huì)再被點(diǎn)到。
        但是如果班級(jí)中所有的學(xué)生都點(diǎn)完了,需要重新開(kāi)啟第二輪點(diǎn)名。*/


        //1.定義集合
        ArrayList<String> list1 = new ArrayList<>();
        //2.添加數(shù)據(jù)
        Collections.addAll(list1, "范閑", "范建", "范統(tǒng)", "杜子騰", "杜琦燕", "宋合泛", "侯籠藤", "朱益群", "朱穆朗瑪峰", "袁明媛");
        //創(chuàng)建一個(gè)臨時(shí)的集合,用來(lái)存已經(jīng)被點(diǎn)到學(xué)生的名字
        ArrayList<String> list2 = new ArrayList<>();
        //外循環(huán):表示輪數(shù)
        for (int i = 1; i <= 10; i++) {
            System.out.println("=========第" + i + "輪點(diǎn)名開(kāi)始了======================");
            //3.獲取集合的長(zhǎng)度
            int count = list1.size();
            //4.隨機(jī)點(diǎn)名
            Random r = new Random();
            //內(nèi)循環(huán):每一輪中隨機(jī)循環(huán)抽取的過(guò)程
            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);
            }
            //此時(shí)表示一輪點(diǎn)名結(jié)束
            //list1 空了 list2 10個(gè)學(xué)生的名字
            list1.addAll(list2);
            list2.clear();

        }
    }
}

練習(xí)4:集合的嵌套

需求:

? 定義一個(gè)Map集合,鍵用表示省份名稱province,值表示市city,但是市會(huì)有多個(gè)。

添加完畢后,遍歷結(jié)果格式如下:

? 江蘇省 = 南京市,揚(yáng)州市,蘇州市,無(wú)錫市,常州市

湖北省 = 武漢市,孝感市,十堰市,宜昌市,鄂州市

河北省 = 石家莊市,唐山市,邢臺(tái)市,保定市,張家口市

代碼實(shí)現(xiàn):

public class Test4 {
    public static void main(String[] args) {
        /* 需求
        定義一個(gè)Map集合,鍵用表示省份名稱province,值表示市city,但是市會(huì)有多個(gè)。
        添加完畢后,遍歷結(jié)果格式如下:
                江蘇省 = 南京市,揚(yáng)州市,蘇州市,無(wú)錫市,常州市
                湖北省 = 武漢市,孝感市,十堰市,宜昌市,鄂州市
                河北省 = 石家莊市,唐山市,邢臺(tái)市,保定市,張家口市*/


        //1.創(chuàng)建Map集合
        HashMap<String, ArrayList<String>> hm = new HashMap<>();

        //2.創(chuàng)建單列集合存儲(chǔ)市
        ArrayList<String> city1 = new ArrayList<>();
        city1.add("南京市");
        city1.add("揚(yáng)州市");
        city1.add("蘇州市");
        city1.add("無(wú)錫市");
        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("邢臺(tái)市");
        city3.add("保定市");
        city3.add("張家口市");

        //3.把省份和多個(gè)市添加到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依次表示每一個(gè)鍵值對(duì)對(duì)象
            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. 斗地主發(fā)牌

4.1 案例介紹

按照斗地主的規(guī)則,完成洗牌發(fā)牌的動(dòng)作。
具體規(guī)則:

使用54張牌打亂順序,三個(gè)玩家參與游戲,三人交替摸牌,每人17張牌,最后三張留作底牌。

4.2 案例分析

  • 準(zhǔn)備牌:

    牌可以設(shè)計(jì)為一個(gè)ArrayList,每個(gè)字符串為一張牌。
    每張牌由花色數(shù)字兩部分組成,我們可以使用花色集合與數(shù)字集合嵌套迭代完成每張牌的組裝。
    牌由Collections類的shuffle方法進(jìn)行隨機(jī)排序。

  • 發(fā)牌

    將每個(gè)人以及底牌設(shè)計(jì)為ArrayList,將最后3張牌直接存放于底牌,剩余牌通過(guò)對(duì)3取模依次發(fā)牌。

  • 看牌

    直接打印每個(gè)集合。

4.3 代碼實(shí)現(xiàn)

public class App {
    public static void main(String[] args) {
      /*
        完成控制臺(tái)版的三步:
          準(zhǔn)備牌
          洗牌
          發(fā)牌
       */
        //從程序的主入口開(kāi)啟斗地主游戲
        new PokerGame();
    }
}

public class PokerGame {
    //牌盒
    //?3 ?3
    static ArrayList<String> list = new ArrayList<>();

    //靜態(tài)代碼塊
    //特點(diǎn):隨著類的加載而在加載的,而且只執(zhí)行一次。
    static {
        //準(zhǔn)備牌
        // "?", "?", "?", "?"
        // "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 依次表示每一個(gè)數(shù)字
                list.add(c + n);
            }
        }
        list.add("小王");
        list.add("大王");
    }

    public PokerGame(){
        //洗牌
        Collections.shuffle(list);

        //發(fā)牌
        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;
            }

            //給三個(gè)玩家輪流發(fā)牌
            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);

    }

    /*
    * 參數(shù)一:玩家的名字
    * 參數(shù)二:每位玩家的牌
    * */
    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) {
      /*
        完成控制臺(tái)版的四步:
          準(zhǔn)備牌
          洗牌
          發(fā)牌
          排序

       */

		//從程序的主入口開(kāi)啟斗地主游戲
        new PokerGame();
    }
}


public class PokerGame {
    //牌盒 Map
    //此時(shí)我們只要把牌跟序號(hào)產(chǎn)生對(duì)應(yīng)關(guān)系就可以了,不需要按照序號(hào)進(jìn)行排序,所以只要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"};

        //序號(hào)
        int serialNumber = 1;
        //細(xì)節(jié)
        for (String n : number) {
            //依次表示每一個(gè)數(shù)字
            for (String c : color) {
                //依次表示每一個(gè)花色
                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);

        //發(fā)牌
        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 :依次表示集合中的每一個(gè)索引
            //list.get(i)元素:牌的序號(hào)
            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);

    }

    /*
    * 參數(shù)一:玩家的名字
    * 參數(shù)二:牌的序號(hào)
    * */
    public void lookPoker(String name, TreeSet<Integer> ts){
        System.out.print(name + ": ");
        //遍歷TreeSet集合得到每一個(gè)序號(hào),再拿著序號(hào)到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<>();

    //創(chuàng)建一個(gè)集合,用來(lái)添加牌的價(jià)值
    static HashMap<String, Integer> hm = new HashMap<>();

    static {
        //準(zhǔn)備牌
        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(" 大王");


        //指定牌的價(jià)值
        //牌上的數(shù)字到Map集合中判斷是否存在
        //存在,獲取價(jià)值
        //不存在,本身的數(shù)字就是價(jià)值
        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);

        //發(fā)牌
        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);
            //發(fā)底牌
            if (i <= 2) {
                lord.add(poker);
                continue;
            }

            //給三個(gè)玩家輪流發(fā)牌
            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);
    }


    /*
     * 參數(shù)一:玩家的名字
     * 參數(shù)二:每位玩家的牌
     * */
    public void lookPoker(String name, ArrayList<String> list){
        System.out.print(name + ": ");
        for (String poker : list) {
            System.out.print(poker + " ");
        }
        System.out.println();

    }


    //利用牌的價(jià)值進(jìn)行排序
    //參數(shù):集合
    //?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:表示當(dāng)前要插入到有序序列中的牌
                //o2:表示已經(jīng)在有序序列中存在的牌

                //負(fù)數(shù):o1小 插入到前面
                //正數(shù):o1大 插入到后面
                //0:o1的數(shù)字跟o2的數(shù)字是一樣的,需要按照花色再次排序

                //1.計(jì)算o1的花色和價(jià)值   大王
                String color1 = o1.substring(0, 1);
                int value1 = getValue(o1);

                //2.計(jì)算o2的花色和價(jià)值
                String color2 = o2.substring(0, 1);
                int value2 = getValue(o2);

                //3.比較o1和o2的價(jià)值    ?3  ?3
                int i = value1 - value2;
                return i == 0 ? color1.compareTo(color2) : i;

            }
        });
    }

    //計(jì)算牌的價(jià)值
    //參數(shù):牌
    //返回值:價(jià)值
    public int getValue(String poker){//?3
        //獲取牌上的數(shù)字
        String number = poker.substring(1);//把這里截取出來(lái)的結(jié)果,讓這個(gè)結(jié)果再M(fèi)ap集合中存在 “ 大王”
        //拿著數(shù)字到map集合中判斷是否存在
        if(hm.containsKey(number)){
            //存在,獲取價(jià)值
            return hm.get(number);
        }else{
            //不存在,類型轉(zhuǎn)換
            return Integer.parseInt(number);
        }
    }
}

后記
????????美好的一天,到此結(jié)束,下次繼續(xù)努力!欲知后續(xù),請(qǐng)看下回分解,寫作不易,感謝大家的支持??! ??????
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-725384.html

到了這里,關(guān)于從零開(kāi)始學(xué)習(xí) Java:簡(jiǎn)單易懂的入門指南之可變參數(shù)及Collections類(二十五)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包