package com.gkhy.exam.common.utils;
|
|
import java.util.Comparator;
|
|
public class NaturalOrderComparator implements Comparator<String> {
|
private boolean isDigit(char ch) {
|
return ch >= '0' && ch <= '9';
|
}
|
|
@Override
|
public int compare(String s1, String s2) {
|
if (s1 == null || s2 == null) {
|
return 0; // 或根据业务决定 null 的排序位置
|
}
|
|
int i1 = 0, i2 = 0;
|
while (i1 < s1.length() && i2 < s2.length()) {
|
char c1 = s1.charAt(i1);
|
char c2 = s2.charAt(i2);
|
|
if (isDigit(c1) && isDigit(c2)) {
|
// 比较数字部分
|
long n1 = 0, n2 = 0;
|
while (i1 < s1.length() && isDigit(s1.charAt(i1))) {
|
n1 = n1 * 10 + (s1.charAt(i1++) - '0');
|
}
|
while (i2 < s2.length() && isDigit(s2.charAt(i2))) {
|
n2 = n2 * 10 + (s2.charAt(i2++) - '0');
|
}
|
if (n1 != n2) {
|
return Long.compare(n1, n2);
|
}
|
} else {
|
// 非数字字符比较
|
if (c1 != c2) {
|
return Character.compare(c1, c2);
|
}
|
i1++;
|
i2++;
|
}
|
}
|
|
// 剩余长度比较
|
return Integer.compare(s1.length(), s2.length());
|
}
|
}
|