今日學習内容:Collections工具類
Collections工具類
- 簡介
-
- 常用方法以及代碼展示
-
- 可變參數
簡介
是集合的工具類,主要用來對單列集合進行操作。
常用方法以及代碼展示
public static void shuffle(List<?>list)
//打亂集合順序,傳入的參數必須是List接口類型(如List<> list=new ArrayList<>() 實質是多态,父類指向子類對象),也可以直接是List的實作類對象(如:ArrayList<> list=new ArrayList<>())
public static<t> void sort(List<t>list)
//将集合中的元素按照預設規則排序,傳入的參數必須是List接口類型(如List<> list=new ArrayList<>() 實質是多态,父類指向子類對象),也可以直接是List的實作類對象(如:ArrayList<> list=new ArrayList<>())
public static<t> void sort(List<t>list,Comparator<? super T>)
//将集合中的元素按照指定規則排序,Comparator是一個比較器,用來指定排序規則的。
代碼部分:
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
System.out.println(list); //[1, 2, 3, 4]
//建立一個集合,随後添加元素,然後列印,結果如上。
//補充,可以直接列印的原因是List裡面重寫了toString()方法,是以列印的并不是位址值。
//打亂集合元素
Collections.shuffle(list);
System.out.println(list);//[2, 1, 3, 4]
//集合元素按照預設規則進行排序
Collections.sort(list);
System.out.println(list);//[1, 2, 3, 4]
預設排序規則:要求集合元素所屬的類必須實作Comparable接口,并且重寫compareTo方法,在方法中寫好排序的規則。Integer類中是按照升序進行排列。
下面舉例集合元素為自定義類:
//集合元素為自定義類并且重寫了toString方法
public class person {
String name;
int age;
public person() {
}
public person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
List<person> list = new ArrayList<>();
person p1=new person("hjh",18);
person p2=new person("zyj",28);
person p3=new person("yj",24);
person p4=new person("wzyj",22);
person p5=new person("zrfyj",32);
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
System.out.println(list);//[person{name='hjh', age=18}, person{name='zyj', age=28}, person{name='yj', age=24}, person{name='wzyj', age=22}, person{name='zrfyj', age=32}]
此時若想用Collections.sort()方法對list進行排序,會出現錯誤,因為person類并沒有實作comparable接口和重寫compareTo方法
此時試試person類實作接口并重寫方法
public class person implements Comparable{
String name;
int age;
public person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Object o) {
//在這裡指定排序規則
//前(第一個參數)-後(第二個參數):升序
//後(第二個參數)-前(第一個參數):降序
//前一般指調用這個方法的對象,可以用this來表示。後也就是參數中的o
person o2=(person)o;
return o2.age-this.age;
}
}
下面是測試結果:
public class test1 {
public static void main(String[] args) {
List<person> list = new ArrayList<>();
person p1=new person("hjh",18);
person p2=new person("zyj",28);
person p3=new person("yj",24);
person p4=new person("wzyj",22);
person p5=new person("zrfyj",32);
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
System.out.println(list);//按照輸入順序輸出的:[person{name='hjh', age=18}, person{name='zyj', age=28}, person{name='yj', age=24}, person{name='wzyj', age=22}, person{name='zrfyj', age=32}]
Collections.sort(list);
System.out.println(list);//按照年齡降序排列的。[person{name='zrfyj', age=32}, person{name='zyj', age=28}, person{name='yj', age=24}, person{name='wzyj', age=22}, person{name='hjh', age=18}]
}
}
可變參數
引子:
//定義一個方法,需要接收五個int類型的參數(比較繁瑣)
public static void method1(int num1,int num2,int num3,int num4,int num5){
}
想到了解決方法
//參數是一個int類型的數組,需要提前将int數值傳到數組中。
publi static void method(int[] arr){}
上述兩種方法隻能 分别接收多個資料 或者 隻能接收數組,都不夠好,是以有了可變參數,下面是定義。
如果定義一個方法,需要接收多個參數,如果參數類型一緻,我們可以使用可變參數對其簡化。
格式:
修飾符 傳回值類型 方法名(資料類型…變量名)
代碼:
//定義一個方法,需要接收五個int類型的參數
public static void method3(int...nums){}
此處既可以傳入多個參數,也可以直接穿入一個提前存好資料的數組.此處的nums就當成數組使用,通過索引取出資料。
注意事項:
一個方法隻能有一個可變參數;
如果方法有多個參數,可變參數要放到最後
應用場景:
在Collections中也提供了一個往集合中添加一些元素的方法:
==public static boolean addAll(Collectionc,T…elements)
代碼:
ArrayList<String> numbers = new ArrayList<>();
Collections.addAll(numbers, "2", "A", "K");
System.out.println(numbers);//[2, A, K]