自定義規則 Collections.sort() 對 List 排序
阿新 • • 發佈:2019-02-04
二、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()重寫:
經過自定義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); } }