gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:23:00 24 4
gpt4 key购买 nike

我有一个 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 测试

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

最佳答案

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

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 检查和其他健全性检查。上面的代码是理想化的,并假设这不是一个问题。

关于java - 使用字母数字值对 Java 中的自定义对象列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59214873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com