前言: 本文主要針對的是 Java 自帶的排序函數(shù)/接口
1. Java 中數(shù)組的自定義排序方法
實(shí)現(xiàn) Comparable 接口中的 compareTo 函數(shù)或?qū)崿F(xiàn) Comparator 接口中的 compare 函數(shù)
兩者存在使用上的區(qū)別,大體而言,Comparable 接口是為類服務(wù),Comparator 接口是為 sort (Arrays.sort / Collections.sort)方法服務(wù)
1.1 基本類型
基本類型存在很多種,這里舉例 int 型數(shù)組
1.1.1 升序排列
例如想要升序排序 int 型數(shù)組 nums,可以通過調(diào)用 Arrays.sort(nums) 方法進(jìn)行升序排列
int[] nums = new int[]{4, 1, 6, 3};
// 升序
Arrays.sort(nums);
具體來講,Arrays 類中的 sort 方法這樣寫道
Sorts the specified array of objects into ascending order, according to the natural ordering of its elements.
解釋: 根據(jù)指定數(shù)組元素的自然順序?qū)⒅付〝?shù)組的對象(數(shù)組中的元素)遞增排序
那么對于整數(shù)而言,就是按照升序排列
1.1.2 降序排列
那么如果我想降序排列呢?那么這種額外的“需求”就需要自定義一個(gè)比較器(Comparator),在定義完比較器后,可以由 Arrays.sort 重載函數(shù)實(shí)現(xiàn)這種額外的“需求”,下面是 Arrays.sort 重載函數(shù)
public static <T> void sort(T[] a, Comparator<? super T> c) {
// ....
}
下面這段話是關(guān)于這個(gè)函數(shù)的解釋
Sorts the specified array of objects according to the order induced by the specified comparator
解釋: 排序的順序是通過指定的比較器(comparator)來推斷出來的,以此將數(shù)組的對象(數(shù)組中的元素)進(jìn)行排序
也就是說,這個(gè)函數(shù)要求我們自定義一個(gè)比較器(Comparator),通過引入 Comparator 接口,實(shí)現(xiàn)這個(gè)接口中的 compare 方法來告訴 Arrays.sort 函數(shù)如何排序
除此之外,我還應(yīng)注意到,這個(gè)函數(shù)使用了泛型 T,因?yàn)榉盒鸵蟀莸谋仨毷菍ο箢愋?,?int 是基本類型,所以第一個(gè)參數(shù) T[] a 中的 a 不能是基本類型 int[]
好在 Java 中存在基本類型的包裝類,例如: int 基本類型對應(yīng)著 Integer 包裝類,那么我們就通過如下方式,實(shí)現(xiàn) int 型數(shù)組的降序排列
int[] nums = new int[]{4, 1, 6, 3};
// 降序
Integer[] newNums = new Integer[nums.length];
for (int i = 0; i < nums.length; i++) newNums[i] = nums[i];
Arrays.sort(newNums, new Comparator<>(){
@Override
public int compare(Integer o1, Integer o2) {
if (o1 > o2) return -1;// 若此處指定為1, 則為升序
else if (o1 < o2) return 1;// 若此處指定為-1, 則為升序
else return 0;
}
});
關(guān)于為什么 compare 中 o1 > o2 時(shí)要返回 -1 是降序,我查詢了諸多資料都得不到一個(gè)確切的解釋。但是可以明確的是: 排序的順序是基于返回值的
在升序情況下,對于 compare(Integer o1, Integer o2) 函數(shù)
if (o1 > o2) return 1; // 或其他正整數(shù)
else if (o1 < o2) return -1; // 或其他負(fù)整數(shù)
else return 0; // 兩者相等時(shí)
在降序情況下,對于 compare(Integer o1, Integer o2) 函數(shù)
if (o1 > o2) return -1; // 或其他負(fù)整數(shù)
else if (o1 < o2) return 1; // 或其他負(fù)整數(shù)
else return 0; // 兩者相等時(shí)
對于 compareTo(Integer o2) 函數(shù)也有
o1.compareTo(o2); // 升序
-o1.compareTo(o2); // 降序
由于 Java 8 引入的 Lambda 表達(dá)式,Arrays.sort 可以簡化為
Arrays.sort(newNums, (Integer o1, Integer o2) -> {
if (o1 > o2) return -1;
else if (o1 < o2) return 1;
else return 0;
});
// 我們還可以省略掉參數(shù)的類型
Arrays.sort(newNums, (o1, o2) -> {
if (o1 > o2) return -1;
else if (o1 < o2) return 1;
else return 0;
});
// 當(dāng)然,我們還可以直接調(diào)用 Integer 包裝類中實(shí)現(xiàn)的 compareTo 方法(默認(rèn)是升序)
// 所需要在 o1.compareTo(o2) 前加負(fù)號
Arrays.sort(newNums, (o1, o2) -> -o1.compareTo(o2));
// 此外,我們還可以調(diào)用 Collections 類中的 reverseOrder 方法來實(shí)現(xiàn)逆序
Arrays.sort(newNums, Collections.reverseOrder());
至此,我們可以完成基本類型的降序排序
1.2 對象(自定義)類型
對象類型存在很多種,這里舉例 String 型數(shù)組
1.2.1 實(shí)現(xiàn) Comparable 接口中的 compareTo 函數(shù)
// Comparable 接口一般由自定類所實(shí)現(xiàn),例如有 Person 類,想以 age 升序排序 Person 對象
Class Person implements Comparable{
int age;
// ... 省略中間細(xì)節(jié)
// 實(shí)現(xiàn)了 Comparable 接口中的 compareTo 方法
@Override
public int compareTo(Object o) {
Person person = (Person)o;
if (this.age > person.age) return 1;
else if (this.age < person.age) return -1;
else return 0;
}
}
之后,便可以通過 Arrays.sort 以 age 升序排序 Person 對象文章來源:http://www.zghlxwxcb.cn/news/detail-468244.html
// 創(chuàng)建 Person 數(shù)組
Person[] persons = new Person[]{new Person(18), new Person(20)};
// 按照 age 升序排序 Person 對象
Arrays.sort(persons);
1.2.2 實(shí)現(xiàn) Comparator 接口中的 compare 函數(shù)
同基本類型降序排序部分大同小異,在此不作敘述文章來源地址http://www.zghlxwxcb.cn/news/detail-468244.html
到了這里,關(guān)于Java 中數(shù)組的排序(基本類型,對象類型)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!