經過Collections的sort方法對List進行排序,有兩種方法實現:java
List<T>中的對象應實現Comparable接口,並實現其compareTo方法ide
//須要比較的對象類PersonH函數
public class PersonH implements Comparable<PersonH> { private int level; public Integer getLevel() { return level; } public void setLevel(Integer level1) { this.level = level1; } @Override public int compareTo(PersonH o) { return this.getLevel().compareTo(o.getLevel()); } }
//Main類this
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Main { /** * @param args */ public static void main(String[] args) { PersonH person = new PersonH(); person.setLevel(6); PersonH person2 = new PersonH(); person2.setLevel(8); PersonH person3 = new PersonH(); person3.setLevel(3); List<PersonH> personList = new ArrayList<PersonH>(); personList.add(person); personList.add(person2); personList.add(person3); Collections.sort(personList);//排序 for(PersonH personH : personList) //輸出排序後結果 { System.out.print(personH.getLevel() + "\t"); } } }
//運行結果:3 6 8spa
這種方式至關於類PersonH具有了指定的基本排序策略,因它實現了compareTo方法code
2. 根據Collections.sort重載之,來實現對象
//PersonH類排序
public class PersonH { private int level; public Integer getLevel() { return level; } public void setLevel(Integer level1) { this.level = level1; } }
//Main類接口
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; public class Main { /** * @param args */ public static void main(String[] args) { PersonH person = new PersonH(); person.setLevel(6); PersonH person2 = new PersonH(); person2.setLevel(8); PersonH person3 = new PersonH(); person3.setLevel(3); ArrayList<PersonH> personList = new ArrayList<PersonH>(); personList.add(person); personList.add(person2); personList.add(person3); //這裏能夠更加靈活地指定比較策略,第一種實現方法是在要比較對象的類中就固定了比較策略。 Collections.sort(personList,new Comparator<PersonH>() { public int compare(PersonH p1,PersonH p2) { return p1.getLevel().compareTo(p2.getLevel()); } }); for(PersonH personH : personList) { System.out.print(personH.getLevel() + "\t"); } } }
//運行結果:3 6 8rem
下面看一下該方法是如何進行排序的:
對於第一種:
public static <T extends Comparable<? super T>> void sort(List<T> list) { Object[] a = list.toArray(); Arrays.sort(a); ListIterator<T> i = list.listIterator(); for (int j=0; j<a.length; j++) { i.next(); i.set((T)a[j]); } }
public static void sort(Object[] a) { if (LegacyMergeSort.userRequested) legacyMergeSort(a); else ComparableTimSort.sort(a); } /** To be removed in a future release. */ private static void legacyMergeSort(Object[] a) { Object[] aux = a.clone(); mergeSort(aux, a, 0, a.length, 0); }
對於第二種:
public static <T> void sort(List<T> list, Comparator<? super T> c) { Object[] a = list.toArray(); Arrays.sort(a, (Comparator)c); ListIterator i = list.listIterator(); for (int j=0; j<a.length; j++) { i.next(); i.set(a[j]); } }
public static <T> void sort(T[] a, Comparator<? super T> c) { if (LegacyMergeSort.userRequested) legacyMergeSort(a, c); else TimSort.sort(a, c); } /** To be removed in a future release. */ private static <T> void legacyMergeSort(T[] a, Comparator<? super T> c) { T[] aux = a.clone(); if (c==null) mergeSort(aux, a, 0, a.length, 0); else mergeSort(aux, a, 0, a.length, 0, c); }
總之,兩種方式都是經過mergeSort和TimSort實現的。
首先看是否指定排序策略,若是沒有,則和第一種走同樣的邏輯;不然進行指定比較策略的歸併排序。
mergeSort函數的源代碼能夠參考java.util.Arrays類。