如何使用Collections.reverse對list集合進行降序排序
使用Collections.reverse對list集合進行降序排序
今天無意中搜了一下Collections.reverse這個方法,結(jié)果發(fā)現(xiàn)有些人對它的誤解蠻深的。下面是一個有百萬訪問量博主寫的,reverse可以對指定列表進行降序排序,可是自己輸出的結(jié)果都不是降序。

確實,使用Collections.reverse結(jié)合一定方法可以實現(xiàn)對list集合降序排序,但是直接使用Collections.reverse(list)這種方式來降序是錯誤的。
reverse的意思是反轉(zhuǎn),而不是降序。只是將list集合原來的順序反轉(zhuǎn)了一下,反轉(zhuǎn)并不意味著降序了。所以要想實現(xiàn)降序,可以先對集合進行升序,然后再反轉(zhuǎn),這樣就降序了。
舉個例子:
import java.util.*;
public class Test {
private static Map<Integer, String> map = new HashMap<Integer, String>();
public static void main(String[] args) {
long[] data = {1506326821000l, 1506327060000l, 1506326880000l, 1506327000000l, 1506326940000l, 1506326760000l, 1506326700000l};
List list = new ArrayList<>();
for (long key : data) {
list.add(key);
}
System.out.println(list);
//先升序
Collections.sort(list);
System.out.println(list);
//再反轉(zhuǎn)
Collections.reverse(list);
System.out.println(list);
}
}
輸出:
[1506326821000, 1506327060000, 1506326880000, 1506327000000, 1506326940000, 1506326760000, 1506326700000]
[1506326700000, 1506326760000, 1506326821000, 1506326880000, 1506326940000, 1506327000000, 1506327060000]
[1506327060000, 1506327000000, 1506326940000, 1506326880000, 1506326821000, 1506326760000, 1506326700000]
Collections.reverse原理
public static void reverse(List<?> list) {
int size = list.size();
//REVERSE_THRESHOLD =18 數(shù)據(jù)倒敘大小限制
if (size < REVERSE_THRESHOLD || list instanceof RandomAccess) {
//折半處理,前后交換
//size>>1 相等于 size/2
for (int i=0, mid=size>>1, j=size-1; i<mid; i++, j--){
swap(list, i, j);
}
} else {
ListIterator fwd = list.listIterator();
ListIterator rev = list.listIterator(size);
for (int i=0, mid=list.size()>>1; i<mid; i++) {
Object tmp = fwd.next();
fwd.set(rev.previous());
rev.set(tmp);
}
}
}
(1)next():返回集合中Iterator指向位置后面的元素
(2)previous():返回列表中ListIterator指向位置前面的元素
public static void swap(List<?> list, int i, int j) {
final List l = list;
//l.set(j, l.get(i)) 獲取原來的數(shù)據(jù)
l.set(i, l.set(j, l.get(i)));
}
public ListIterator<E> listIterator(int index) {
if (index < 0 || index > size)
throw new IndexOutOfBoundsException("Index: "+index);
return new ListItr(index);
}
public E set(int index, E element) {
rangeCheck(index);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
淺析SpringBoot中使用thymeleaf找不到.HTML文件的原因
這篇文章主要介紹了SpringBoot中使用thymeleaf找不到.HTML文件的原因分析,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
SpringMVC?Restful風(fēng)格與中文亂碼問題解決方案介紹
Restful就是一個資源定位及資源操作的風(fēng)格,不是標(biāo)準(zhǔn)也不是協(xié)議,只是一種風(fēng)格,是對http協(xié)議的詮釋,下面這篇文章主要給大家介紹了關(guān)于SpringMVC對Restful風(fēng)格支持的相關(guān)資料,需要的朋友可以參考下2022-10-10
SpringBoot SSO輕松實現(xiàn)(附demo)
這篇文章主要介紹了SpringBoot SSO輕松實現(xiàn)(附demo),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01

