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