如何使用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 (将#修改为@)