zoukankan      html  css  js  c++  java
  • Collections常用的静态方法浅析之排序:sort(List list)

          Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。最近接触到这个类,于是想仔细的研究一下该类所提供的各个方法的用途及使用方法。

          今天就简单的介绍一下sort(List<T> list)的用途和使用方法。

          在JDK1.6中对于Collection的sort(List<T> list)方法是这样介绍的:根据元素的自然顺序 对指定列表按升序进行排序。列表中的所有元素都必须实现 Comparable 接口。此外,列表中的所有元素都必须是 可相互比较的(也就是说,对于列表中的任何 e1 和 e2 元素,e1.compareTo(e2) 不得抛出 ClassCastException)。此排序被保证是 稳定的:不会因调用 sort 方法而对相等的元素进行重新排序。指定列表必须是可修改的,但不必是大小可调整的。该排序算法是一个经过修改的合并排序算法(其中,如果低子列表中的最高元素小于高子列表中的最低元素,则忽略合并)。此算法提供可保证的 n log(n) 性能。 此实现将指定列表转储到一个数组中,并对数组进行排序,在重置数组中相应位置处每个元素的列表上进行迭代。这避免了由于试图对适当位置上的链接列表进行排序而产生的 n2 log(n) 性能。

          我们可以看到该方法是对一个List进行排序的,并且对List所存储的内容有所要求,下面我们测试一下各种情况的排序。

          因为我们在该测试时要多次的对List进行输出,所以我写了一个静态方法供调用:

         在后面的代码中会使用这个方法将List的内容输出。下面,我们测试一下List中存储基本类型时的情况。

         调用sort排序方法前输出的是:54241
         调用sort排序方法后输出的是:12445

           这里我们看到该方法对基本类型的排序非常简单就是按照大小的自然排序。下面我们在看看对引用类型的String是怎么进行排序的。

         调用sort排序方法前输出的是:b aa basd eas dds
         调用sort排序方法后输出的是:aa b basd dds eas

         根据这里的结果我们也能很轻松的看出排序规则是按照开头字母的顺序排的序。记得JDK中所说该方法的排序规则是: 列表中的所有元素都必须实现 Comparable 接口 。并且实现compareTo方法,sort方法就是按照compareTo方法比较后返回的int值进行的排序,经过查看JDK的String类的源码能找到该方法的实现以及比较规则,下面我们看看它实现的方法:

         我们看到它是将字符串拆成了char类型的数组,然后挨个元素比较char值,最后将结果返回。

         普通的引用类型我们看过了比较规则,下面我们再看看我们自己定义的引用类型是怎么进行比较和排序的。

           首先,先定义一个类然后再比较。

         接着在使用sort排序:

         这时我们发现在调用sort()方法的时候报错了, 通过我们对String源码的研究以及JDK对sort方法的描述我们知道必须要实现 Comparable 接口。 并且要重写compareTo()方法,现在我们就在刚才的Person类中实现接口并且重写该方法。

         接着我们再在刚才的方法sortPerson()中调用sort()方法时就不会报错了。

         调用sort方法前输出:20岁的张三  ==>  30岁的李四  ==>  10岁的王五三  ==>

         调用sort方法后输出:10岁的王五三  ==>  20岁的张三  ==>  30岁的李四  ==>

         在我们自己定义的类中我们可以自己定义比较的规则,我们也就能控制sort()方法的排序规则,以上就是我对Collections类的sort(List<T> list)方法的理解。


  • 相关阅读:
    npm的使用
    js 数组去重
    js实现对象或者数组深拷贝
    js简单排序
    js判断类型
    鼠标移入移出事件
    jq中的attr和prop属性
    移动端底部被输入法顶起的解决办法
    vue中的number
    javascript要点(上)
  • 原文地址:https://www.cnblogs.com/SunnyYue/p/3970299.html
Copyright © 2011-2022 走看看