对ArrayList< String>进行排序排除字符串前半部分的数字
我正在尝试对ArrayList进行排序,该ArrayList也由一系列String组成(XX和YY是数字):
I'm trying to sort an ArrayList which a series of String composed as well (XX and YY are numbers):
Test: XX Genere: Maschio Eta: YY Protocollo: A
我将仅考虑YY值进行链接以对其进行排序.我找到了这种方法,但是它考虑了字符串的所有数字,并且我无法删除YY之前的 n 个数字,因为我不知道XX由多少个数字组成:
I would link to sort them by only considering the YY value. I found this method but it considerers all the digits of the string and I cannot remove n digits before YY because I don't know from how many digits is composed XX:
Collections.sort(strings, new Comparator<String>() {
public int compare(String o1, String o2) {
return extractInt(o1) - extractInt(o2);
}
int extractInt(String s) {
String num = s.replaceAll("\\D", "");
// return 0 if no digits found
return num.isEmpty() ? 0 : Integer.parseInt(num);
}
});
您还需要提出如何对第二部分中没有数字的字符串进行排序的方法.
You also need to come up with how you'd like to sort the strings that don't have a number in the second part.
Collections.sort(strings, new Comparator<String>() {
public int compare(String o1, String o2) {
return Comparator.comparingInt(this::extractInt)
.thenComparing(Comparator.naturalOrder())
.compare(o1, o2);
}
private int extractInt(String s) {
try {
return Integer.parseInt(s.split(":")[1].trim());
}
catch (NumberFormatException exception) {
// if the given String has no number in the second part,
// I treat such Strings equally, and compare them naturally later
return -1;
}
}
});
更新
如果您确定 Integer.parseInt(s.split(:")[1] .trim())
不会因异常而失败,则 Comparator.comparingInt(this ::extractInt)
就足够了,您可以选择较短的比较器.
If you are sure Integer.parseInt(s.split(":")[1].trim())
never fails with an exception, Comparator.comparingInt(this::extractInt)
would be enough, and you could go with a shorter comparator.
Collections.sort(strings,
Comparator.comparingInt(s -> Integer.parseInt(s.split(":")[1].trim())));