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è)集合。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-725384.html
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)!