簡單總結
默認情況下:Java實現(xiàn)Comparator排序是升序稀拐,即自然排序
根據(jù)參數(shù)荆隘,返回值來判斷是否交換
對于a针贬,b兩個參數(shù)(a在前棘劣,b在后)
jdk官方的升序基于:
< return -1
> return 1
= return 0
降序就是反過來
< return 1
> return -1
= return 0
底層源碼的實現(xiàn)可參考:java comparator 升序山宾、降序至扰、倒序從源碼角度理解
如果要升序:那么a<b就是想要的順序,所以return -1 资锰,false敢课,不交換。
如果要降序:那么a<b就是不想要的順序绷杜,所以return 1直秆,true,要交換鞭盟。
為了方便記憶圾结,總結了如下的規(guī)律:
- 當不管大于、小于齿诉、等于時筝野,我們都返回 -1,那么就是倒序鹃两。
- 當不管大于遗座、小于、等于時俊扳,我們都返回0或者1時途蒋,效果是一樣的,就是不排序馋记。但是0表示的是号坡,相同元素不排序懊烤,要是我們把等于返回為-1,那么兩個相同的元素會交互順序宽堆;
- 當需要返回-1腌紧、1、0時畜隶,返回1的時候進行位置交換壁肋。
升序
ArrayList< Integer > list = new ArrayList<>();
list.add(2);
list.add(1);
list.add(3);
list.add(4);
list.add(8);
list.add(8);
list.sort(new Comparator< Integer >() {
@Override
public int compare(Integer o1, Integer o2) {
// 升序 返回1的時候進行位置交換
if (o1 < o2) {
return -1;
} else if (o1 > o2) {
return 1;
} else {
return 0;
}
}
});
System.out.print("排序后 = ");
for (int i = 0; i < list.size(); i++) {
Integer integer = list.get(i);
System.out.print(integer);
if (i != list.size() - 1) {
System.out.print("、");
}
}
// 結果
// 排序后 = 1籽慢、2浸遗、3、4箱亿、8跛锌、8
降序
ArrayList< Integer > list = new ArrayList<>();
list.add(2);
list.add(1);
list.add(3);
list.add(4);
list.add(8);
list.add(8);
list.sort(new Comparator< Integer >() {
@Override
public int compare(Integer o1, Integer o2) {
// 降序 返回1的時候進行位置交換
if (o1 > o2) {
return -1;
} else if (o1 < o2) {
return 1;
} else {
return 0;
}
}
});
System.out.print("排序后 = ");
for (int i = 0; i < list.size(); i++) {
Integer integer = list.get(i);
System.out.print(integer);
if (i != list.size() - 1) {
System.out.print("、");
}
}
// 結果
// 排序后 = 8届惋、8髓帽、4、3脑豹、1郑藏、2
倒序
ArrayList< Integer > list = new ArrayList<>();
list.add(2);
list.add(1);
list.add(3);
list.add(4);
list.add(8);
list.add(8);
list.sort(new Comparator< Integer >() {
@Override
public int compare(Integer o1, Integer o2) {
//不管大于、小于和等于 都返回 -1
return -1;
}
});
System.out.print("排序后 = ");
for (int i = 0; i < list.size(); i++) {
Integer integer = list.get(i);
System.out.print(integer);
if (i != list.size() - 1) {
System.out.print("瘩欺、");
}
}
// 結果
// 排序后 = 8译秦、8、4击碗、3、1们拙、2
不變
假設不管大于稍途、小于、等于
砚婆,我們都返回0
械拍,會發(fā)現(xiàn)順序沒有變;而且你會發(fā)現(xiàn)装盯,要是都返回1
的話坷虑,順序也是沒有變的!
當不管大于埂奈、小于迄损、等于
時,我們都返回一個值時账磺,0
和1
效果是一樣的芹敌,就是不排序痊远;-1
就是倒序。
ArrayList< Integer > list = new ArrayList<>();
list.add(2);
list.add(1);
list.add(3);
list.add(4);
list.add(8);
list.add(8);
list.sort(new Comparator< Integer >() {
@Override
public int compare(Integer o1, Integer o2) {
// 返回0或者1的時候不排序
return 1;
}
});
System.out.print("排序后 = ");
for (int i = 0; i < list.size(); i++) {
Integer integer = list.get(i);
System.out.print(integer);
if (i != list.size() - 1) {
System.out.print("氏捞、");
}
}
// 結果
// 排序后 = 2碧聪、1、3液茎、4逞姿、8、8
其實0表示的是捆等,相同元素不排序滞造,要是我們把等于返回為-1,那么兩個相同的元素會交互順序楚里;
對數(shù)字而言交換順序沒有關系断部,但是里面要是是Map對象的話,那就有關系班缎,因為有時我們是希望相同元素不進行順序調整的蝴光。
代碼鏈接:ComparatorDemo