由于业务需求,需要将list<String>数组排序,如果字符串起始有数字从大到小排序,如没有数字放最后。
函数
public static List<String> sortStringsByNumberPrefix(List<String> list) {
// 使用自定义比较器进行排序
list.sort(new Comparator<String>() {
// 提取字符串中的数字部分
private final Pattern numberPattern = Pattern.compile("(\\d+)");
@Override
public int compare(String s1, String s2) {
Matcher matcher1 = numberPattern.matcher(s1);
Matcher matcher2 = numberPattern.matcher(s2);
if (matcher1.find() && matcher2.find()) {
int num1 = Integer.parseInt(matcher1.group());
int num2 = Integer.parseInt(matcher2.group());
// 先按数字部分排序
int numCompare = Integer.compare(num1, num2);
if (numCompare != 0) {
return numCompare;
}
}
// 如果数字部分相同,则按字符串自然顺序排序
return s1.compareTo(s2);
}
});
// 将带有数字前缀的字符串移到前面,不带数字前缀的字符串移到后面
List<String> result = new ArrayList<>();
List<String> noNumberList = new ArrayList<>();
for (String str : list) {
if (containsDigit(str)) {
result.add(str);
} else {
noNumberList.add(str);
}
}
result.addAll(noNumberList);
return result;
}