如何使用Collections.reverse对list集合进行降序排序 目录 使用Collections.reverse对list集合进行降序排序 Collections.reverse原理 使用Collections.reverse对list集合进行降序排序 今天无意中搜了一下Collections.reverse这个方法,结果发现有些人对它的误解蛮深的.下面是
目录
- 使用Collections.reverse对list集合进行降序排序
 - Collections.reverse原理
 
使用Collections.reverse对list集合进行降序排序
今天无意中搜了一下Collections.reverse这个方法,结果发现有些人对它的误解蛮深的。下面是一个有百万访问量博主写的,reverse可以对指定列表进行降序排序,可是自己输出的结果都不是降序。

确实,使用Collections.reverse结合一定方法可以实现对list集合降序排序,但是直接使用Collections.reverse(list)这种方式来降序是错误的。
reverse的意思是反转,而不是降序。只是将list集合原来的顺序反转了一下,反转并不意味着降序了。所以要想实现降序,可以先对集合进行升序,然后再反转,这样就降序了。
举个例子:
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);
    //再反转
    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 数据倒叙大小限制
        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)) 获取原来的数据
  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;
    }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
本文标题为:如何使用Collections.reverse对list集合进行降序排序
				
        
 
            
        - Springboot整合minio实现文件服务的教程详解 2022-12-03
 - 深入了解Spring的事务传播机制 2023-06-02
 - Java中的日期时间处理及格式化处理 2023-04-18
 - JSP 制作验证码的实例详解 2023-07-30
 - ExecutorService Callable Future多线程返回结果原理解析 2023-06-01
 - JSP页面间传值问题实例简析 2023-08-03
 - SpringBoot使用thymeleaf实现一个前端表格方法详解 2023-06-06
 - Java实现顺序表的操作详解 2023-05-19
 - Spring Security权限想要细化到按钮实现示例 2023-03-07
 - 基于Java Agent的premain方式实现方法耗时监控问题 2023-06-17
 
						
						
						
						
						
				
				
				
				