Java 列表元素自定義排序

天航星發表於2024-10-15

在 Java 開發過程中,有時會遇到需要對列表中元素進行自定義的排序。

這樣的排序往往不能由元素本身的特性(比如字串長度、首字母順序)判斷,需要自己指定順序。

比如對漢字的數字進行排序,他們的字串長度都為 1,首字母順序也不能得到預期的結果,因此需要自定義排序。

以下是示例程式碼:

public static void main(String[] args) {
    
    // 自定義順序列表
    List<String> customSortList = new ArrayList<>();
    customSortList.add("一");
    customSortList.add("二");
    customSortList.add("三");
    customSortList.add("四");
    customSortList.add("五");
    customSortList.add("六");
    customSortList.add("七");
    customSortList.add("八");
    customSortList.add("九");
    // 實際資料列表
    List<String> realDataList = new ArrayList<>();
    realDataList.add("三");
    realDataList.add("九");
    realDataList.add("八");
    realDataList.add("四");
    realDataList.add("五");
    realDataList.add("二");
    realDataList.add("一");
    realDataList.add("六");
    realDataList.add("七");
    // 自定義排序  
    realDataList.sort((s1, s2) -> {

        // 獲取s1在自定義順序列表中的位置
        int index1 = customSortList.indexOf(s1);
        // 獲取s2在自定義順序列表中的位置
        int index2 = customSortList.indexOf(s2);
        // 如果字串不在自定義順序列表中,可以決定它們的位置  
        // 這裡假設不在列表中的字串應該排在最後  
        if (index1 == -1) {
            // 如果兩個都不在列表中,則它們相等;否則,s1排在s2後面
            return (index2 == -1) ? 0 : 1;
        }
        // s2不在列表中,所以s1排在s2前面  
        if (index2 == -1) {
            return -1;
        }
        // 否則,按照自定義順序列表中的索引進行排序  
        return Integer.compare(index1, index2);
    });
    System.out.println(Arrays.toString(realDataList.toArray()));
}

列印結果:

[一, 二, 三, 四, 五, 六, 七, 八, 九]

這樣就得到了預期的結果。

如果需要改變排序規則(比如倒序),只需要改變自定義順序列表的元素新增順序即可。

相關文章