簡體   English   中英

使用字母數字值對 Java 中的自定義對象列表進行排序

[英]Sort list of custom objects in Java using alphanumeric values

我有一個帶有getFolderName方法的Folder對象列表(返回一個String )。

我正在嘗試對列表進行排序,但我遇到了順序不正確的問題,因為某些文件夾名稱以數值開頭,例如:

  • 1 測試
  • 2 測試
  • 3 測試
  • 4 測試
  • ...
  • 9 測試
  • 10 測試
  • 11 測試
  • 12 測試

這是我的代碼:

Collections.sort(folders, new Comparator<Folder>() {
 @Override
 public int compare(Folder folder1, Folder folder2) {
  return Integer.compare(folder1.getFolderName(), folder2.getFolderName());
 }
});

電流輸出:

  • 1 測試
  • 10 測試
  • 11 測試
  • 12 測試
  • 2 測試
  • 3 測試
  • 4 測試
  • ...
  • 8 測試
  • 9 測試

預期輸出:

  • 1 測試
  • 2 測試
  • 3 測試
  • 4 測試
  • ...
  • 8 測試
  • 9 測試
  • 10 測試
  • 11 測試
  • 12 測試

我缺少什么來正確排序列表?

我認為您在這里想要的邏輯是首先按字母順序比較文件夾名稱,然后在兩個文件夾具有相同名稱的情況下,使用前導數字打破平局。 我們可以嘗試以下方式:

Collections.sort(folders, new Comparator<Folder>() {
    @Override
    public int compare(Folder folder1, Folder folder2) {
        String f1 = folder1.getFolderName();
        String f2 = folder2.getFolderName();
        String f1name = f1.replaceAll("\\d+\\s+(.*)", "$1");
        String f2name = f2.replaceAll("\\d+\\s+(.*)", "$1");
        if (f1name.compareTo(f2name) != 0) {
            return f1name.compareTo(f2name);
        }
        else {
            int num1 = Integer.parseInt(f1.replaceAll("(\\d+)\\b.*", "$1"));
            int num2 = Integer.parseInt(f2.replaceAll("(\\d+)\\b.*", "$1"));
            return Integer.compare(num1, num2);
        }
    }
});

請注意,我省略了多個地方的null檢查和其他健全性檢查等內容。 上面的代碼是理想化的,並假設這不是問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM