Collections.sort()泛型集合排序的使用,和自定义类实现Comparable<T>接口重写compareTo(T o)方法完成Collections.sort()排序,以及自定义排序规则
Collections算法類
????????1.Collections類是Java提供的一個集合操作工具類。
????????2.Collections類定義了一系列用于操作集合的靜態方法,用于實現對集合元素的排序、查找和替換等操作。
????????3.Collections和Collection是不同的,前者是集合的操作類,后者是集合接口
Collections的常用靜態方法(不是所有的方法)
? ? ? ? 1.sort(集合對象):排序
????????2.binarySearch(集合對象):折半查找——返回查找對象下標位置
????????3.max(集合對象) \ min(集合對象):查找最大\最小值——返回查找到的對象
Collections排序
? ? ? ? 1.實現一個類的對象之間比較大小,該類要實現Comparable<T>接口(T為通配符,匹配一個類型,實現該接口需要傳入實現類作為泛型約束)
? ? ? ? 2.重寫?Comparable<T>接口?的 public int compareTo(T o)方法?。
? ? ? ? 3.實現方法返回值約定:如果該對象小于、等于或大于指定對象,則分別返回負整數、零或正整數
Collections排序案例:
????????學生類Student實現了Comparable<Student>接口,重寫 compareTo(Student o)方法,通過比較學號實現對象之間的大小比較。
注意
????????1. 使用Collections.sort(集合對象)排序時,如果集合中存的是Java自帶的類型的數據,如Integer,則不需要該類型內實現Comparable<T>接口(閱讀源碼可發現其內部已自動實現接口重寫方法),如果是自定義類型,如num類,Student類,則需要實現Comparable<T>并重寫 public int compareTo(T o)方法。
????????2.調用Collections.max和min不需要先排序,但是如果使用折半查找則必須先Collections.sort(集合對象)排序,不然折半查找不論是否存在都返回-1;
? ? ? ? 3.實現compareTo(T o)方法,我們只要根據要求,對傳入參數的相關數值進行判斷比較,并返回相應的負整數零或者正整數即可,不需要關心比大小的具體實現,因為調用Collections.sort()方法后,其工具類會有相應的方法調用我們重寫好的compareTo(T o)方法來使用。
實際操作
public class Test {public static void main(String[] args) {//創建集合并添加值List list = new ArrayList();list.add(new num(3));list.add(new num(2));list.add(new num(1));//調用排序方法Collections.sort(list);//輸出排序后結果for (Object o: list) {System.out.println(((num)o).getNum());}System.out.println();//輸出最大最小值System.out.println(((num)Collections.max(list)).getNum());System.out.println(((num)Collections.min(list)).getNum());System.out.println();//輸出一個類型的在集合中的下標位置System.out.println((Collections.binarySearch(list,new num(1))));System.out.println();} }class num implements Comparable<num>{private int num;public num(int num) {this.num = num;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}/** 重寫的compareTo(num o)方法* 如果該對象小于、等于或大于指定對象,則分別返回負整數、零或正整數。* 該對象:this,調用次方法的對象* 指定對象:參數傳進來的對象* */@Overridepublic int compareTo(num o) {return this.num>o.num?1:this.num==o.num?0:-1;} }運行后效果,先排序后遍歷輸出,后輸出最大最小值,再輸出一個指定對象所在集合的下標
?自定義排序規則
以此案例為例子解釋?
? ? ? ? 如果我們不想比學生的學號大小,假如現在要求按照學生成績排序,那我們就根據成績排序來做一個成績排行榜,只需要在 compareTo 方法中把比較的參數換一下就行,比如原本是調用num這個屬性,換成 this.age 和 參數對象.age 比較即可。
(此工具類有一個很好地特性,如果比較成績,兩個成績相同,則會比較與之相鄰的下一個數值型的值,判斷大小來以此排列)
偏實用派的人推薦直接看這篇文章,言簡意賅:Collections comparable_Azadoo的博客-CSDN博客
總結
以上是生活随笔為你收集整理的Collections.sort()泛型集合排序的使用,和自定义类实现Comparable<T>接口重写compareTo(T o)方法完成Collections.sort()排序,以及自定义排序规则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么在电脑设wifi密码忘记了怎么办呢
- 下一篇: Map的Value值转换为List集合