package jef.tools.string;
import java.util.Comparator;
/**
* 字符串排序器,目的是处理字符串和数字混杂时的,对于位于相同位置的数字串,按数字大小排序,而不是按其ASCII编码排序
*
* @see java.util.Comparator
*/
public final class StringComparator implements Comparator<String> {
public static final StringComparator INSTANCE = new StringComparator();
private StringComparator() {
}
@Override
public int compare(String o1, String o2) {
int len1 = o1.length();
int len2 = o2.length();
int lim = Math.min(len1, len2);
int j = 0;
int k = 0;
StringBuilder numCache1 = new StringBuilder();
StringBuilder numCache2 = new StringBuilder();
while (k < lim && j < lim) {
char c1 = o1.charAt(j++);
char c2 = o2.charAt(k++);
if (CharUtils.isNumber(c1) && CharUtils.isNumber(c2)) {
while (CharUtils.isNumber(c1)) {
numCache1.append(c1);
if (j == len1)
break;
c1 = o1.charAt(j++);
}
while (CharUtils.isNumber(c2)) {
numCache2.append(c2);
if (k == len2)
break;
c2 = o2.charAt(k++);
}
if(numCache1.length()>18 || numCache2.length()>18) {
int n=numCache1.toString().compareTo(numCache2.toString());
numCache1.setLength(0);
numCache2.setLength(0);
if(n!=0) {
return n;
}else {
continue;
}
}else {
long n1 = Long.valueOf(numCache1.toString());
long n2 = Long.valueOf(numCache2.toString());
numCache1.setLength(0);
numCache2.setLength(0);
if (n1 != n2) {
return n1 - n2 > 0 ? 1 : -1;
} else {
continue;
}
}
}
if (c1 != c2) {
return c1 - c2;
}
}
return len1 - j - len2 + k;
}
}