【发布时间】:2020-02-18 14:43:46
【问题描述】:
我正在为我的大学实现一些代码,我必须按其名称对两个类进行排序。因此,我开始使用 Java 的 compareTo 处理字符串,但它没有正确执行。比如我有TEST-6和TEST-10这两个名字。但是,结果是TEST-10 领先于TEST-6。
我已经搜索并得到了这个解决方案:
private int compare(String o1, String o2) {
return extractInt(o1) - extractInt(o2);
}
private int extractInt(String s) {
String num = s.replaceAll("\\D", "");
// return 0 if no digits found
return num.isEmpty() ? 0 : Integer.parseInt(num);
}
但我的字符串可以采用任何形式。当我尝试这个测试时:TEST-6 和TEST10) 结果是TEST-6 领先于TEST10,但我期望的是TEST10 然后是TEST-6。
预期的结果应该是正常的字符串比较,但是在需要的时候比较全数。因此,如果数字之前的子字符串相等,则比较该数字,如果不相等,则继续进行字符串比较。 或者是这样的:
TE
TES-100
TEST-1
TEST-6
TESTT-0
TEXT-2
109
【问题讨论】:
-
它总是一个非数字后跟一个正整数吗?可以有
a1b2c3d4之类的东西吗? -
另外,为什么
109是最后一个?既然非数字部分是空字符串,不应该是第一个吗? -
您基本上必须将字符串拆分为数字和非数字部分并一一比较。但是,必须解析数字部分才能获得正确的顺序。
-
-6 小于 10,因此排序按预期工作。
-
您的
compareTo可以比较 数字之前的两个字符串(如果字符串没有任何数字,则需要整个字符串进行比较)。所以:a= "foo1bar"和b="foo2"将导致"foo"与"foo"进行比较。如果两个字符串现在已经排序,那么很好,但是当它们相等时(如"foo=foo"),那么你比较它们的数字1 comparedTo 2——这将导致foo1bar在foo2之前......等等,您必须比较和转换/比较所有子字符串,直到获得订单。
标签: java string sorting alphabetical