您的位置:首页 > 其它

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

2014-12-19 19:41 507 查看

一、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后,实现的效果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: