在 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()));
}
列印結果:
[一, 二, 三, 四, 五, 六, 七, 八, 九]
這樣就得到了預期的結果。
如果需要改變排序規則(比如倒序),只需要改變自定義順序列表的元素新增順序即可。