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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值