发现
要对结果进行排序,您需要先找到所有结果。如果您事先不知道所有结果,则可以生成任何部分排序列表。所以你会有类似的东西:
List<Integer> results = new ArrayList<Integer>();
while (there are more results) { // here you ask the regex if it found some more item
// add integer to results
String found = ... // here you grab the string you've just found
results.add(Integer.parseInt(found)); // convert the string to integer and add to list
}
请注意,我将找到的字符串直接转换为 Integer,因为它作为 Integer 具有更多意义。如果出于任何原因你想要一个字符串,好的,有一个List<String>
并且不要转换。
排序
在你有一个未排序的列表后,你需要对其进行排序。有几种方法,Java 实现了一种非常简单的方法。它可以进行任何类型的排序,因为它不进行两个项目之间的比较。这是唯一需要实现以定义如何排序的部分。你会做:
Collections.sort(results, comparator);
此方法将实现合并排序(如果我没记错的话)并在每次需要比较两个元素时询问您提供的比较器。这个比较器应该实现接口Comparator<T>
whereT
是结果中元素的类型。
如果它们是整数,则不需要比较器,因为它已经具有“自然”顺序:
Collections.sort(results);
但是如果你想要一些特殊的排序(比如根据它的整数表示的值排序字符串),那么你可以使用你自己的比较器:
Collections.sort(results, new Comparator<String>() {
public int compare(String a, String b) {
int valueA = Integer.parseInt(a);
int valueB = Integer.parseInt(b);
return valueA - valueB;
}
});
比较必须返回:
- 如果 a < b 则为负
- 0 如果 a == b
- 如果 a > b 则为正。
由于我们想像比较数字一样比较字符串,这就是我所做的:将它们转换为数字并比较它们的数值。
对字符串进行排序:xxx-nnnn-nnnn
在您的情况下,您正在收集具有该格式(abc-1234-5678)的字符串,您需要根据第一个数字对它们进行排序。所以让我们假设你已经收集了你的字符串:
List<String> results
然后,您需要根据一些任意标准对这些字符串进行排序。像往常一样,您需要调用Collections.sort
提供一个特殊的比较器。
该比较器需要比较的不是整个字符串,而是每个字符串的第一个数字。例如:abc-1234-5678
和def-3456-1988
。你必须与1234
比较3456
。
然后代码将如下所示:
Collections.sort(results, new Comparator<String>() {
public int compare(String str1, String str2) {
// obtain the number you'll use to compare
int value1 = getImportantNumber(str1);
int value2 = getImportantNumber(str2);
// return comparator (remember, the sign of the results says if it's <, =, >)
return value1 - value2;
}
// this method will extract the number, maybe you'll need a regex or substring, dunno
private int getImportantNumber(String str) {
// by example
Matcher m = PATTERN.matcher(str);
if (!m.find())
return -1; // or throw an exception, depends on you're requirements
String numberPart = m.group(...); // the number of the group catching the part you need
return Integer.parseInt(numberPart);
}
private static Pattern PATTERN = Pattern.compile("....");
});
哪个正则表达式
我应该使用:
(\w+)-(\d+)(-(\d+))*
这发现:
letters-numbers[-numbers[-numbers...]]
但是,如果您不确定是否能找到第二名的数字,我应该选择:
String[] parts = str.split("-");
for (String part: parts)
if (this part has only numbers)
return Integer.parseInt(part);
// if there are no only number parts
throw new RuntimeException("Not valid number part found!");