繁体   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