问题描述
代码使用 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 (将#修改为@)