陣列有工具類Arrays,集合也有一個工具類Collections,這里練習一下集合工具類的排序方法,順便過一下sort排序方法,比較器,
sort方法
根據其元素的natural ordering對指定的串列進行排序,sort(List<T> list):sort(List<T> list, Comparator<? super T> c):根據指定的比較器引起的順序對指定的串列進行排序,
第一個方法使用:
public class Dome01 { public static void main(String[] args) { ArrayList<Integer> arrayList = new ArrayList<Integer>(); //Collections集合工具的添加方法 Collections.addAll(arrayList, 21,31,23,12,54,-21,3,98,0); arrayList.forEach((s) -> System.out.print(s+" "));//依次輸出并沒有排序 21 31 23 12 54 -21 3 98 0 //呼叫sort方法排序 Collections.sort(arrayList); arrayList.forEach((s) -> System.out.print(s+" "));//從小到大排序輸出 -21 0 3 12 21 23 31 54 98 } }
上面是針對int 資料型別的資料排序,在針對其他型別的資料時,使用sort排序就不會生效,如下:
public static void main(String[] args) { ArrayList<Character> arrayList = new ArrayList<Character>(); Collections.addAll(arrayList, 'w','s','o','q'); arrayList.forEach((s) -> System.out.print(s)); // 依次列印 wsoq 并沒有進行abc 做這樣排序 }
這個時候,就要使用第二種方式了比較器實作
public static void main(String[] args) { ArrayList<Character> arrayList = new ArrayList<Character>(); Collections.addAll(arrayList, 'f','s','q','h','1'); Collections.sort(arrayList, new Comparator<Character>() { @Override public int compare(Character o1, Character o2) { return o1 - o2; } }); arrayList.forEach(s -> System.out.print(s+" "));//根據ASCII排序 1 f h q s }
o1 - o2是從小到大排序,反過來就少從大到小,上面使用匿名內部類使用的,
排序自定義型別:
public class ComparatorDome { public static void main(String[] args) { Student[] student = new Student[5]; // 實體化Student并定義為陣列 // 賦值 0 1 2 3 4 5 student[0] = new Student("zhangsan", 16); student[1] = new Student("lisi", 22); student[2] = new Student("wangwu", 19); student[3] = new Student("tom", 27); student[4] = new Student("tom", 17); int a[] = { 32, 31, 2, 334, -212, 99 }; Arrays.sort(a); // Arrays.sort Arrays工具類提供方法排列陣列 System.out.println(Arrays.toString(a)); /* Arrays工具類可以拍類基本資料型別的陣列 但是怎么排列上面的學生類資料呢 */ /* 比較器的使用 */ // 第一種使用手動排序方法Comparator介面 Arrays.sort(student, new ComparatorDome02()); System.out.println(Arrays.toString(student)); // 第二種使用自然排序方法 Comparable介面 Arrays.sort(student); System.out.println(Arrays.toString(student)); } } /* * 由于介面無法實體化物件,所以我們,創建一個類來實作它 然后來創建這個類的物件 */ class ComparatorDome02 implements Comparator<Student> { // Comparator是用來手動排序的類 Comparable是默認自然比較器 // 重寫compareTo方法 @Override public int compare(Student o1, Student o2) { if (o1.getAge() - o2.getAge() == 0) { return o1.getName().charAt(0) - o2.getName().charAt(0); } else { return o1.getAge() - o2.getAge(); } } /* * 總結比較器: 在對Student排序的時候,由于在Arrays * 工具類中沒有定義Student型別的排序規則,jvm編譯時在想我該怎么編譯這個玩意呢,當然jvm畢竟是 機器它不會去思考,所以jvm直接反饋一個錯誤給我們 * java.lang.ClassCastException,所以可以想到jvm排序這個Student需要一個規則,一個叫jvm怎么去排序這個陣列的規則,通過解刨原始碼 * 我們可以發現,在排序基本型別資料時,原始碼都繼承了一個介面 Comparable<Integer>再次跟進 發現定義規則的抽象方法compareTo * 照葫蘆畫瓢,我們定義規則并將規則傳達給Arrays工具類,使其按照我們定義的規則來排序陣列 * Comparable,Comparator兩個比較器達到的目的都是一樣的,但是實作方法兩種:一個是在該Student類中直接定義 ,一個是假借他人之手 * 來制定規則, 排序的依舊是Arrays工具類,我們做的是制定規則 */ }
Comparable和Comparator兩個介面的區別
Comparable:強行對實作它的每個類的物件進行整體排序,這種排序被稱為類的自然排序,類的compareTo方法被稱為它的自然比較方法,只能在類中實作compareTo()一次,不能經常修改類的代碼實作自己想要的排序,實作此介面的物件串列(和陣列)可以通過Collections.sort(和Arrays.sort)進行自動排序,物件可以用作有序映射中的鍵或有序集合中的元素,無需指定比較器, Comparator:強行對某個物件進行整體排序,可以將Comparator 傳遞給sort方法(如Collections.sort或Arrays.sort),從而允許在排序順序上實作精確控制,還可以使用Comparator來控制某些資料結構(如有序set或有序映射)的順序,或者為那些沒有自然順序的物件collection提供排序,轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/73375.html
標籤:Java
上一篇:Java中同步的基本概念監視器–最簡單粗暴的理解方法
下一篇:Java自學-圖形界面 選單
