使用字母数字值对Java中的自定义对象进行排序

问题描述 投票:1回答:1

我用Folder方法获得了getFolderName对象的列表(返回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测试

我在正确排序列表时缺少什么?

java list sorting
1个回答
0
投票

我认为您要在逻辑上首先按字母顺序比较文件夹名称,然后在两个文件夹具有相同名称的情况下,使用前导数字打破平局。我们可以尝试以下方法:

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检查和其他健全性检查之类的内容。上面的代码是理想的,并且假定这不是问题。

© www.soinside.com 2019 - 2024. All rights reserved.