Java中Collections.sort()方法详解

这篇具有很好参考价值的文章主要介绍了Java中Collections.sort()方法详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.介绍

Collections.sort()方法的参数为一个List集合,用于给集合进行排序。
Collections.sort()内部进行了方法重载,可以只传入一个List集合参数,也可以传入一个List集合参数和一个Comparator接口对象并实现其中的compare方法

2.Comparator接口下的compare方法

升序排列

 public static void main(String[] args) {
    Integer[] nums = new Integer[]{3, 7, 9, 2, 1};
    Arrays.sort(nums, new Comparator<Integer>() {

        @Override
        public int compare(Integer o1, Integer o2) {
            return o1 - o2;
        }
    });
    for (Integer i : nums) {
        System.out.print(i + "  ");  // 1 2 3 7 9
    }
}

降序排列

public static void main(String[] args) {
    Integer[] nums = new Integer[]{3, 7, 9, 2, 1};
    Arrays.sort(nums, new Comparator<Integer>() {

        @Override
        public int compare(Integer o1, Integer o2) {
            return o2 - o1;
        }
    });
    for (Integer i : nums) {
        System.out.print(i + "  ");9 7 3 2 1
    }
}

所以更多时候我们是直接记住了compare(int o1, int o2)方法 return o1 - o2 是升序,return o2 - o1 是降序。为什么会这样写呢?我们不妨看一下sort(T[] a, Comparator<? super T> c)方法

public static <T> void sort(T[] a, Comparator<? super T> c) {
    if (c == null) {
        sort(a);
    } else {
        if (LegacyMergeSort.userRequested)
            legacyMergeSort(a, c);
        else
            TimSort.sort(a, 0, a.length, c, null, 0, 0);
    }
}

可以看出他是进去了else内,不妨先进入legacyMergeSort看一下

private static <T> void legacyMergeSort(T[] a, Comparator<? super T> c) {
    T[] aux = a.clone();
    if (c==null)
        mergeSort(aux, a, 0, a.length, 0);
    else
        mergeSort(aux, a, 0, a.length, 0, c);
}


这里很明显也是进去了else内,继续看mergeSort

private static void mergeSort(Object[] src,Object[] dest,int low, int high, int off,Comparator c) {
        int length = high - low;

        // Insertion sort on smallest arrays
        if (length < INSERTIONSORT_THRESHOLD) {
            for (int i=low; i<high; i++)
                for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--)
                    swap(dest, j, j-1);
            return;
        }

        // Recursively sort halves of dest into src
        int destLow  = low;
        int destHigh = high;
        low  += off;
        high += off;
        int mid = (low + high) >>> 1;
        mergeSort(dest, src, low, mid, -off, c);
        mergeSort(dest, src, mid, high, -off, c);

        // If list is already sorted, just copy from src to dest.  This is an
        // optimization that results in faster sorts for nearly ordered lists.
        if (c.compare(src[mid-1], src[mid]) <= 0) {
           System.arraycopy(src, low, dest, destLow, length);
           return;
        }

        // Merge sorted halves (now in src) into dest
        for(int i = destLow, p = low, q = mid; i < destHigh; i++) {
            if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0)
                dest[i] = src[p++];
            else
                dest[i] = src[q++];
        }
    }

这一段的代码关键就是如下部分

if (length < INSERTIONSORT_THRESHOLD) {
    for (int i=low; i<high; i++)
        for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--)
            swap(dest, j, j-1);
    return;
}

可以看到这里面调用了compare方法,当方法的返回值大于0的时候就将数组的前一个数和后一个数做交换。以升序为例来讲解,升序的话compare方法就 return o1 - o2,那么就是 return dest[j-1] - dest[j]。

当 dest[j-1] > dest[j] 时,就进行交换。当 dest[j-1] <= dest[j] 时位置不变,从而达到数组升序。降序也是一样的道理。文章来源地址https://www.toymoban.com/news/detail-836476.html

到了这里,关于Java中Collections.sort()方法详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java Collections源码剖析

    Collections以静态方法的方式提供了很多通用算法和功能,这些功能大概可以分为以下两类。 一类是对容器接口对象进行操作,包括查找、排序、添加和修改。 另一类返回一个容器接口对象,适配器:将其他类型的数据转换为容器接口对象+装饰器:修饰一个给定容器接口对象

    2024年02月19日
    浏览(38)
  • 源码解析Collections.sort ——从一个逃过单测的 bug 说起

    本文从一个小明写的bug 开始,讲bug的发现、排查定位,并由此展开对涉及的算法进行图解分析和源码分析。 事情挺曲折的,因为小明的代码是有单测的,让小明更加笃定自己写的没问题。所以在排查的时候,也经历了前世的500年,去排查排序后的list改动( 主要是小明和同事

    2024年02月16日
    浏览(39)
  • Java Collections类排序学习

    jdk自带排序学习,比如我们写一个排序代码 来看一下sort的实现 继续跟进 如果没有自定义排序就执行默认排序 legacyMergeSort 归并排序默认关闭的,重点关注 ComparableTimSort.sort 如果小于 private static final int MIN_MERGE = 32;大小就进行折半插入排序,如果大于32进行 TimSort排序 Timsort是

    2024年01月23日
    浏览(57)
  • Java - 集合工具类Collections

    前言 二.collections提供的方法  三. 方法详解 1.addAll:将所有指定元素添加到指定 collection 中。 可变参数  添加方式 二.shuffle():随机打乱List集合中的元素  三. sort():对List集合进行排序; 实现compatator,重写comapre方法,自定义比较规则  总结 大家好啊,又见面了,今天给大家讲一

    2024年02月06日
    浏览(41)
  • Java中Collection与Collections有什么区别?Java常见面试题解析

    本文将为大家详细讲解Java中Collection与Collections的区别点,这是我们进行开发时经常用到的知识点,也是大家在学习Java中很重要的一个知识点,更是我们在面试时有可能会问到的问题! 文章较长,干货满满,建议大家收藏慢慢学习。文末有本文重点总结,主页有全系列文章分

    2024年02月06日
    浏览(32)
  • Java中Collections.singletonList的使用

    2024年04月11日
    浏览(64)
  • Java 21新特性:Sequenced Collections(有序集合)

    在JDK 21中,Sequenced Collections的引入带来了新的接口和方法来简化集合处理。此增强功能旨在解决访问Java中各种集合类型的第一个和最后一个元素需要非统一且麻烦处理场景。 下面一起通过本文来了解一下不同集合处理示例。 Sequenced Collections引入了三个新接口: SequencedColle

    2024年02月08日
    浏览(48)
  • 【Java 21 新特性】顺序集合(Sequenced Collections)

    引入新的接口表示具有定义的遇到顺序的集合。每个这样的集合都有一个明确定义的第一个元素、第二个元素,依此类推,直到最后一个元素。提供统一的API来访问它的第一个和最后一个元素,并以相反的顺序处理它的元素。 \\\"生活只能向后理解;但必须向前生活。\\\"—基尔克

    2024年02月03日
    浏览(37)
  • 【Java 21 新特性 】顺序集合(Sequenced Collections)

    Java 21 中增加了一种新的集合类型:顺序集合(Sequenced Collections)。 要介绍顺序集合,就首先要说明一下出现顺序(encounter order)。出现顺序指的是在遍历一个集合时,集合中元素的出现顺序。 有些集合类型,有确定的出现顺序,比如  List 。不管遍历多少次这样的集合,其

    2024年02月05日
    浏览(38)
  • Java代码审计——Commons Collections5 BadAttributeValueExpException

    反序列化总纲 cc链无非就是不同的调用拼接在一起形成的,比如cc5就是在cc1的基础上进行调用调整的。 在LazyMap的基础上,发现了一个新的调用方式,就是通过 TiedMapEntry+BadAttributeValueExpException的方式进行调用的。 在之前,我们知道LazyMap需要调用get方法才可以触发,那么我们

    2023年04月16日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包