自定义规则 Collections.sort() 对 List 排序

来源:互联网 发布:翻译见父自然知孝 编辑:程序博客网 时间:2024/05/22 12:01

一、Collections.sort()与Arrays.sort()的比较

       Collections.sort()该算法是一个经过修改的合并排序算法(其中,如果低子列表中的最高元素效益高子列表中的最低元素,则忽略合并)。此算法可提供保证的N*log(N)的性能,此实现将指定列表转储到一个数组中,然后再对数组进行排序,在重置数组中相应位置处每个元素的列表上进行迭代。这避免了由于试图原地对链接列表进行排序而产生的n2 log(n)性能
      Arrays.sort()
该算法是一个经过调优的快速排序,此算法在很多数据集上提供N*log(N)的性能,这导致其他快速排序会降低二次型性能。

二、Collections.sort()实现自定义排序

       Collections.sort()Arrays.sort()都可以实现自定义排序,我们经常会遇到如下的版本号:{"2","2.2","2.11","2.10.12","2.6.9.5","2.6.9.4"},如果我们使用Collections.sort()默认的方法进行排序,就会出现如下图的结果:

这个的排序,很显然不符合我们的要求,2.10.12应该排列在最后面,为了达到我们想要的效果,现在对Comparator()重写:
package com.string;import java.util.Arrays;import java.util.Collections;import java.util.Comparator;import java.util.List;public class CompareVersion {public static void main(String[] args) {/*准备数据集*/List<String> lists=Arrays.asList(new String []{"2","2.2","2.11","2.10.12","2.6.9.5","2.6.9.4"});System.out.println("==============重写Comparator方法之前==================");Collections.sort(lists);System.out.println(lists);System.out.println("===================重写Comparator方法之后===================");Collections.sort(lists,new Comparator<String>(){@Override//重写compare方法,实现自定义排序public int compare(String str1, String str2) {String [] str1_items=null;String [] str2_items=null;//对传入的string按一定的规则进行切分if(str1.contains(".")){str1_items=str1.split("\\.");}else{str1_items=new String []{str1};}if(str2.contains(".")){str2_items=str2.split("\\.");}else{str2_items=new String []{str2};}/*下面就是自定义排序的核心,reslut=0,1,-1  分别表示等于,大于,小于*/int result=0;if(str1_items.length ==str2_items.length){//两个字符串含有相同数量的    "."号for(int i=0;i<str1_items.length;i++){//循环进行比对if(Integer.parseInt(str1_items[i])!=Integer.parseInt(str2_items[i])){result=Integer.parseInt(str1_items[i])-Integer.parseInt(str2_items[i]);}else{result=0;}}}else{//两个字符串含有 不同数量的 "."号int i=0;while(true){//循环进行比对if(i>=str1_items.length|i>=str2_items.length){if(str1_items.length>str2_items.length){result=1;break;}else{result=-1;break;}     }else if(Integer.parseInt(str1_items[i])==Integer.parseInt(str2_items[i])){//如果相等就继续比对     i++;}else{result=Integer.parseInt(str1_items[i])-Integer.parseInt(str2_items[i]);//如果不相等就返回结果break;}}}return result;}});System.out.println(lists);}}
经过自定义Comparator后,实现的效果如下:


0 0
原创粉丝点击