如何使用String类型的比较器对Java中的对象列表进行排序?

如何解决如何使用String类型的比较器对Java中的对象列表进行排序?

代码使用 for 循环创建测试结果对象(字符串名称、枚举)并将它们添加到列表中,我尝试根据它们的名称对它们进行排序。 对象的名称应该类似于 Test1、Test2、...Test200。 问题在于上面的Test9。例如,Test10 将放在 Test1 和 Test2 之间,而不是放在 Test9 之后。或者 Test20 将在 Test2 和 Test3 之间。

这是我的代码

List<TestResult> testResultList = new ArrayList<>();
        
        
        for (int i = 0; i < 100; i++)
        {
            
            testResultList.add(i,new TestResult(randomTestResultName(),TestStatus.randomEnumTestStatus())); 
               
        }

  //method1 of sorting
   testResultList.sort(Comparator.comparing(TestResult::getTestName));
        
  //method2 of sorting
        testResultList.sort((trl1,trl2)
                -> trl1.getTestName().compareto(
                    trl2.getTestName()));

以及我用来创建随机名称和枚举的方法

private static String randomTestResultName() {
        String t1="Test";
        int randomNum = ThreadLocalRandom.current().nextInt(1,10 + 1);
        String t2 = Integer.toString(randomNum);
        return t1+t2;
    }




 public static TestStatus randomEnumTestStatus() {
            return TestStatus.values()[new Random().nextInt(TestStatus.values().length)];
        }

更新!: 对于任何对字符串结尾有问题的人,请使用此方法,将其用作比较器以使用 lambda 表达式对其进行排序:

public static int compareNatural(String testResultName1,String testResultName2) {
        int lengthOfTestResultName1 = testResultName1.length();
        int lengthOfTestResultName2 = testResultName2.length();
        int browseTestResultName1 = 0;
        int browseTestResultName2 = 0;
        while (true) {
            if (browseTestResultName1 == lengthOfTestResultName1)
                return browseTestResultName2 == lengthOfTestResultName2 ? 0 : -1;
            if (browseTestResultName2 == lengthOfTestResultName2)
                return 1;
            if (testResultName1.charat(browseTestResultName1) >= '0' && testResultName1.charat(browseTestResultName1) <= '9' && testResultName2.charat(browseTestResultName2) >= '0' && testResultName2.charat(browseTestResultName2) <= '9') {
                int na = 0;
                int nb = 0;
                while (browseTestResultName1 < lengthOfTestResultName1 && testResultName1.charat(browseTestResultName1) == '0')
                    browseTestResultName1++;
                while (browseTestResultName1 + na < lengthOfTestResultName1 && testResultName1.charat(browseTestResultName1 + na) >= '0' && testResultName1.charat(browseTestResultName1 + na) <= '9')
                    na++;
                while (browseTestResultName2 < lengthOfTestResultName2 && testResultName2.charat(browseTestResultName2) == '0')
                    browseTestResultName2++;
                while (browseTestResultName2 + nb < lengthOfTestResultName2 && testResultName2.charat(browseTestResultName2 + nb) >= '0' && testResultName2.charat(browseTestResultName2 + nb) <= '9')
                    nb++;
                if (na > nb)
                    return 1;
                if (nb > na)
                    return -1;
                if (browseTestResultName1 == lengthOfTestResultName1)
                    return browseTestResultName2 == lengthOfTestResultName2 ? 0 : -1;
                if (browseTestResultName2 == lengthOfTestResultName2)
                    return 1;

            }
            if (testResultName1.charat(browseTestResultName1) != testResultName2.charat(browseTestResultName2))
                return testResultName1.charat(browseTestResultName1) - testResultName2.charat(browseTestResultName2);
            browseTestResultName1++;
            browseTestResultName2++;
        }
    }

和用于排序的新 lambda 表达式:

testResultList.sort((trl1,trl2)
                -> compareNatural(trl1.getTestName(),trl2.getTestName()) );

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?