咨詢一個問題,這里定義了一個Comparator 比較器,如果這個函式回傳值直接是1,陣列元素順序居然保持不變;如果回傳值直接是-1,
陣列元素順序反而是倒序了。
想請大佬答疑解惑,非常感謝。
import java.io.*;
import java.util.*;
public class phototest {
public static void main(String[] args) throws IOException {
Comparator<Integer> mycmp =new Comparator<Integer>() {
public int compare(Integer a, Integer b) {
return 1;//陣列元素沒有變化
//return -1//陣列元素倒序了
}
};
Integer [] d = {9,8,10,90};
for(int i=0;i<d.length;i++) {
System.out.print(d[i] + " ");
}
System.out.println();
Arrays.sort(d, mycmp);
for(int i=0;i<d.length;i++) {
System.out.print(d[i] + " ");
}
System.out.println();
}
}
uj5u.com熱心網友回復:
你是要排序? 不要直接回傳值, 回傳a>b就好uj5u.com熱心網友回復:
我不是想排序。 我只是想測驗一下,如果直接回傳會有什么效果。。。uj5u.com熱心網友回復:
compare的回傳值有三種情況,正數,零,負數。當回傳值為正數時,表示左值(a)大于右值(b),會進行升序排序;當回傳值為負數時,表示左值小于右值,會進行降序排序。而你沒有進行判斷a和b的大小直接回傳,所以你回傳1時陣列的順序是不變的,回傳-1時陣列是逆序的。因此你要想升序陣列,你得這樣寫。 Comparator<Integer> mycmp =new Comparator<Integer>() {
public int compare(Integer a, Integer b) {
return a > b ? 1 : -1;
}
};想要降序這樣寫。
Comparator<Integer> mycmp =new Comparator<Integer>() {
public int compare(Integer a, Integer b) {
return a < b ? 1 : -1;
}
};
uj5u.com熱心網友回復:
謝謝回復。而你沒有進行判斷a和b的大小直接回傳,所以你回傳1時陣列的順序是不變的,回傳-1時陣列是逆序的
對這里不理解。。。這里我確實沒有判斷直接回傳的,為什么回傳1陣列的順序是不變的呢?
uj5u.com熱心網友回復:
樓主沒有說明自己的疑惑是啥啊?比較器的用途就是要回傳兩個元素的大小關系。
如果樓主強制所有元素的比較規則都是第一個元素比第二個元素大,也就是說直接回傳1,那么,拿這個比較器物件進行比較排序之后的順序,就和排序演算法有關了。
關于排序演算法,常見的有7種吧,樓主可以挑一個簡單易懂的排序演算法,拿你自定義的比較器進行模擬實驗一下,就知道具體是怎么回事了。
至于樓上所說的,原來集合的先后關系不發生變化這個結論,我是不贊同的。
不同的排序演算法,產生的結果不一定相同。
比如,
采用冒泡排序之后,這個集合的順序就被倒序排列了。
采用插入排序的結果應該是前后順序不變。
uj5u.com熱心網友回復:
樓主的這個,強制回傳1,順序沒改變;強制回傳-1,倒序排列 的原因,是要看看JDK底層使用的是什么排序演算法了。不同版本的JDK所采用的排序演算法是不同的。
以前版本的排序演算法,小于7個元素的情況下,是插入排序,所以,會是樓主現在看到的這種結果。
后來版本的排序演算法,采用的是二叉排序演算法,采用樓主自定義的比較器后,二叉樹退化成鏈表,所以,也是樓主現在看到的結果。
但是,這種結果,不具有普遍性。換句話說,就是,不是所有的排序演算法,都會是這樣的結果。
uj5u.com熱心網友回復:
我剛才用你的代碼測驗了一下,發現確實是這樣的效果,出現的原因你看了原始碼就能明白,截取排序方法的官方解釋翻譯
現在你的代碼走的就是這個方法的排序,也就是插入排序,插入排序就是將元素插入到有序的陣列中,因為你的比較器一直回傳的都是1,所以它認為這個元素就是有序的,就不會執行任何的插入排序代碼,通常我們都會寫成a-b,在排序時,你現在的資料時,只需要執行一次插入就能達到有序。即把8插入到9之前
uj5u.com熱心網友回復:
明白了底層使用的是插入排序之后,看起來就沒有那么慢理解了,我們在做排序的時候,通常都會有判斷前者和后者的大小,只有滿足條件才會執行某寫代碼,只是現在判斷的結果是你自己寫的比較器回傳的,但是現在你的比較器回傳的是一個固定值,也就是說,他的判定結果一直是前面的比后面大,或者前面的比后面小,那他執行的時候,就要么不動,要么把它插到前面去。一直重復這個動作知道遍歷完所有的元素。但是我們比較器正常寫法是a-b,這個它在比較的時候有正有負,所以通過不斷的插入,更換位置,就成了有序的了。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/44386.html
標籤:Java SE
