實現Comparable接口的compareTo方法 排序
該接口強行對實現它的每個類的對象進行整體排序。此排序被稱爲該類的自然排序 ,類的 compareTo 方法被稱爲它的自然比較方法 。實現此接口的對象列表(和數組)可以通過 Collections.sort (和 Arrays.sort )進行自動排序。如Jdk 中 Long 根據 value 大小進行排序
Long 類
/**
* Compares two {@code Long} objects numerically.
*
* @param anotherLong the {@code Long} to be compared.
* @return the value {@code 0} if this {@code Long} is
* equal to the argument {@code Long}; a value less than
* {@code 0} if this {@code Long} is numerically less
* than the argument {@code Long}; and a value greater
* than {@code 0} if this {@code Long} is numerically
* greater than the argument {@code Long} (signed
* comparison).
* @since 1.2
*/
public int compareTo(Long anotherLong) {
return compare(this.value, anotherLong.value);
}
/**
* Compares two {@code long} values numerically.
* The value returned is identical to what would be returned by:
* <pre>
* Long.valueOf(x).compareTo(Long.valueOf(y))
* </pre>
*
* @param x the first {@code long} to compare
* @param y the second {@code long} to compare
* @return the value {@code 0} if {@code x == y};
* a value less than {@code 0} if {@code x < y}; and
* a value greater than {@code 0} if {@code x > y}
* @since 1.7
*/
public static int compare(long x, long y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
Test.java
public static void main(String[] args) {
List<Long> longList = new ArrayList<>();
longList.add(10L);//添加 並不會去排序
longList.add(0L);
longList.add(30L);
longList.add(20L);
System.out.println("sort before");
for (Long l : longList) {
System.out.println(l);
}
Collections.sort(longList);
System.out.println("sort after");
for (Long l : longList) {
System.out.println(l);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
運行結果如圖:
接下來 新建 Person 類,以age 屬性進行排序
public class Person implements Comparable<Person> {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Person o) {
//比較此對象與指定對象的順序。如果該對象小於、等於或大於指定對象,則分別返回負整數、零或正整數。
return compare(this.age, o.age);
}
/**
* @param age1
* @param age2
* @return
*/
public static int compare(long age1, long age2) {
return (age1 > age2 ? 1 :
(age1 == age2 ? 0 : -1));
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
Test.java
public static void main(String[] args) {
Person person = new Person("小明",12);
Person person2 = new Person("小紅",11);
Person person3= new Person("小寶",14);
List<Person> personList = new ArrayList<>();
personList.add(person);
personList.add(person2);
personList.add(person3);
System.out.println("sort before");
for (Person person1 : personList) {
System.out.println(person1.toString());
}
Collections.sort(personList);
System.out.println("sort after");
for (Person person1 : personList) {
System.out.println(person1.toString());
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
運行結果如圖:
so easy!
sort 原理
Collections.sort(..);
- 1
跟隨jdk 源碼,這裏是jdk1.8.
ArrayList中的 default sort Method 還是 調用了Arrays.sort() 方法,
public static <T> void sort(T[] a, int fromIndex, int toIndex,
Comparator<? super T> c) {
if (c == null) {
sort(a, fromIndex, toIndex);
} else {
rangeCheck(a.length, fromIndex, toIndex);
if (LegacyMergeSort.userRequested)
legacyMergeSort(a, fromIndex, toIndex, c);
else
TimSort.sort(a, fromIndex, toIndex, c, null, 0, 0);
}
}
public static void sort(Object[] a, int fromIndex, int toIndex) {
rangeCheck(a.length, fromIndex, toIndex);
if (LegacyMergeSort.userRequested)
legacyMergeSort(a, fromIndex, toIndex);
else
ComparableTimSort.sort(a, fromIndex, toIndex, null, 0, 0);
}
/** To be removed in a future release. */
private static void legacyMergeSort(Object[] a,
int fromIndex, int toIndex) {
Object[] aux = copyOfRange(a, fromIndex, toIndex);
mergeSort(aux, a, fromIndex, toIndex, -fromIndex);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
源碼中涉及排序的知識,以後再講
最後
Comparable接口的實現和使用其實非常簡單的,Jdk 都爲我們實現了,我們瞭解原理及使用。