1. 程式人生 > >包含數字的字串排序

包含數字的字串排序

一, Idea的起因

    由於日誌採集專案有種叫做輪轉檔案的東西, 大致解釋就是有一個 a.log, 系統不停的往這個檔案裡面寫內容, 當這個檔案超過50M的時候, 就會把這個檔案重新命名為 a.log.1, 然後再生成一個新的 a.log 

    當我採集的時候, 會發現, 某個目錄地下有  如下圖的東西

    

    這時候, 我需要對這些日誌進行一個排序, 那麼, 如何做到, 排序的合法性?

二, 方案設計

    起初, 前面有個仙人設計了一段程式碼. 我不想貼出來怕會誤導大家. 大致的邏輯是根據檔名的長度來排序. 貌似是很不錯的建議.Good Idea. 然而, 如果這個目錄裡面佈置這一種型別的日誌, 比如還有client.1, clinet.2, clinet.3, 那麼排序出來的肯定是master和client亂成一鍋粥.

三, 功能完成

    我的方案是: 先比較兩個字串, 然後就是挖數字比較.但是要注意必須是同一位置上的數字才能有效比較.

四, 小翠, 上程式碼

    

/*
                           _ooOoo_
                          o8888888o
                          88" . "88
                          (| -_- |)
                          O\  =  /O
                       ____/`---'\____
.' \\| |// `. / \\||| : |||// \ / _||||| -:- |||||- \ | | \\\ - /// | | | \_| ''\---/'' | | \ .-\__ `-` ___/-. / ___`. .' /--.--\ `. . __ ."" '< `.___\_<|>_/___.' >'"".
| | : `- \`.;`\ _ /`;.`/ - ` : | | \ \ `-. \_ __\ /__ _/ .-` / / ======`-.____`-.___\_____/___.-`____.-'====== `=---=' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 佛祖保佑 永無BUG */ import org.junit.Test; import java.util.Comparator; import java.util.Set; import java.util.TreeSet; /** * @description: 工具類 * @author: Wonder * @create: 2018-04-18 16:23 **/ public class WonderUtil { public int getNum(String sb){ if(sb == null){ return 0; } if("".equals(sb)){ return 0; } return Integer.valueOf(sb); } public boolean isNum(char c){ boolean b = false; if(c >= '0' && c <= '9'){ b = true; } return b; } public boolean isChar(char c){ boolean b = false; if((c >= 'a' && c <= 'z' )|| ( c >= 'A' && c <= 'Z')){ b = true; } return b; } /** * 比較兩個包含數字的字串 * @param s1 字串1 * @param s2 字串2 * @return 返回比較結果 */ public int compareTo(String s1, String s2) { int len1 = s1.length(); int len2 = s2.length(); int lim = Math.min(len1, len2); char v1[] = s1.toCharArray(); char v2[] = s2.toCharArray(); char int1[] = null; char int2[] = null; int k = 0; // 外層迴圈用於遍歷兩個字串 while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; // 如果遍歷到兩個字串相同位置都是數字, 那麼就要去把這個數字後面連續的數字都挖出來 if(isNum(c1) && isNum(c2)){ int1 = new char[len1 - k]; int2 = new char[len2 - k]; int count1 = 0; int count2 = 0; int n1,n2; //此迴圈用於挖出 s1 數字, 依次放到預先的int1[] 陣列中 for (int i=k;i<len1;i++){ if(isNum(v1[i])){ int1[count1] = v1[i]; }else { break; } count1++; } //此迴圈用於挖出 s2 的數字, 依次放到預先的int2[] 陣列中 for (int i=k;i<len2;i++){ if(isNum(v2[i])){ int2[count2] = v2[i]; }else { break; } count2++; } n1 =getNum(String.valueOf(int1).trim()); n2 =getNum(String.valueOf(int2).trim()); // 需要判斷n1 n2 是否相等, 如果相等, 則先把 k 移位, 然後continue if(n1 == n2){ k += int1.length; continue; } //如果不相等, 那麼就成功得到了想要的結果 return n1 - n2; } // 如果遍歷的兩個字元不是全為數字的話, 就直接比較, 得出結果 if (c1 != c2) { return c1 - c2; } k++; } return len1 - len2; } @Test public void test(){ String s1 = "abc.txt.1000"; String s2 = "abc.txt.1"; String s3 = "abc.txt.2"; String s4 = "abc.txt.3"; String s5 = "shit.txt.2"; String s6 = "shit.txt.20"; String s7 = "shit.txt.3"; Set<String> set = new TreeSet<>(new Comparator<String>() { @Override public int compare(String o1, String o2) { return compareTo(o1, o2); //設計的功能方法 //return o1.compareTo(o2); //可以忽略的方法 } }); set.add(s1); set.add(s2); set.add(s3); set.add(s4); set.add(s5); set.add(s6); set.add(s7); System.out.println(set); } }                                                                                                 

 

好了, 貼出輸出吧:






===============   裝逼分界線   =============== 

由於本人屬於剛入行的菜鳥一枚, 程式碼難免有難以啟齒的問題.望大佬們多提意見,歡迎嘲諷, 畢竟嘲諷才是前進的動力