首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Comparator 實戰:多欄位遞歸排序範例

     編輯:Java 相關知識

專案需對格式為 a_b_c_d 的字串進行多層級排序,編寫一個通用 Comparator 實現:優先比對第一欄位,相等則遞歸比對後續欄位,全數值轉換比較。

核心實作 TestComparator

import java.util.Comparator;

public class TestComparator implements Comparator {
    public int compare(Object arg0, Object arg1) {
        String[] strF = ((String) arg0).split("_");
        String[] strL = ((String) arg1).split("_");
        int len = strF.length;
        if (len == 1) {
            return Integer.parseInt(strF[0]) - Integer.parseInt(strL[0]);
        }
        for (int i = 0; i < len; i++) {
            if (!strF[i].equals(strL[i])) {
                return Integer.parseInt(strF[i]) - Integer.parseInt(strL[i]);
            } else {
                String strNF = getSubValue(strF, i);
                String strNL = getSubValue(strL, i);
                return compare(strNF, strNL); // 遞歸比對剩餘欄位
            }
        }
        return 0;
    }

    private String getSubValue(String[] arr, int start) {
        StringBuilder sb = new StringBuilder();
        for (int i = start + 1; i < arr.length; i++) {
            if (sb.length() > 0) sb.append('_');
            sb.append(arr[i]);
        }
        return sb.toString();
    }
}

測試驗證

public class Test {
    public static void main(String[] args) {
        String[] data = {"2_2_107_11","4_1_3_8","1_1_103_3","1_2_103_2",
                         "1_1_105_1","2_1_107_5","2_2_107_6","3_1_107_4","2_1_107_10"};
        Arrays.sort(data, new TestComparator());
        for (String s : data) System.out.println(s);
    }
}

輸出結果

1_1_103_3
1_1_105_1
1_2_103_2
2_1_107_5
2_1_107_10
2_2_107_6
2_2_107_11
3_1_107_4
4_1_3_8

設計重點

  • 適用於欄位數固定、全數值的底線分隔字串。
  • 遞歸結構簡潔,但注意深度過大可能導致堆疊溢位(實務上欄位通常 ≤ 10)。
  • 若欄位含非數值,需加入異常處理或改用 String.compareTo。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved