如何使用Collections.reverse对list集合进行降序排序

 更新时间:2021年11月30日 14:02:43   作者:我是李超人  
这篇文章主要介绍了Java使用Collections.reverse对list集合进行降序排序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

使用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;
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot开发中使用DTO层的方法示例

    SpringBoot开发中使用DTO层的方法示例

    DTO层是在应用程序的业务逻辑层和数据访问层之间引入的一个中间层,用于在不同层之间传输数据,本文主要介绍了SpringBoot开发中使用DTO层,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • java实现遍历Map的方法

    java实现遍历Map的方法

    这篇文章主要介绍了java实现遍历Map的方法,以简单实例形式分析了java针对HashMap的遍历技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • Windows下Java环境配置的超详细教程

    Windows下Java环境配置的超详细教程

    这篇文章主要给大家介绍了关于Windows下Java环境配置的超详细教程,文中通过图文将配置的过程介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-01-01
  • IDEA配置码云Gitee的使用详解

    IDEA配置码云Gitee的使用详解

    这篇文章主要介绍了IDEA配置码云Gitee的使用,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • 简要分析Java多进程编程的并发控制

    简要分析Java多进程编程的并发控制

    这篇文章介绍了简要分析Java多进程编程的并发控制,主要针对内存获取方面,需要的朋友可以参考下
    2015-11-11
  • Java利用InputStream类实现文件读取与处理

    Java利用InputStream类实现文件读取与处理

    在Java开发中,输入流(InputStream)是一个非常重要的概念,它涉及到文件读写、网络传输等多个方面,InputStream类是Java中输入流的抽象基类,定义了读取输入流数据的方法,本文将以InputStream类为切入点,介绍Java中的输入流概念及其应用,需要的朋友可以参考下
    2023-11-11
  • 浅谈springmvc的DispatcherServlet分析

    浅谈springmvc的DispatcherServlet分析

    本篇文章主要介绍了浅谈springmvc的DispatcherServlet分析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Spring中IOC和AOP的核心组成架构详解

    Spring中IOC和AOP的核心组成架构详解

    这篇文章主要介绍了Spring中IOC和AOP的核心组成架构详解,本文是对Spring的2大核心功能——IoC和AOP 的总结提炼,并增加了环境profile和条件化bean的内容,篇幅较短,更像是一个大纲,或者思维导图,需要的朋友可以参考下
    2023-08-08
  • 如何基于java实现Gauss消元法过程解析

    如何基于java实现Gauss消元法过程解析

    这篇文章主要介绍了如何基于java实现Gauss消元法过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • SpringBoot整合RabbitMQ实现六种工作模式的示例

    SpringBoot整合RabbitMQ实现六种工作模式的示例

    这篇文章主要介绍了SpringBoot整合RabbitMQ实现六种工作模式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07

最新评论