compareExtend static method
扩展名称排序
- 支持数值排序
- 得到 1,2,3,...,11,12,13,...
- 而非 1,11,12,13,2,3,
- 支持中文转拼音后排序
- 整体顺序:
- 数值
- 特殊字符
- A-Z(中英文字符混合排序)
Implementation
static int compareExtend(String left, String right) {
// 左排前,返回-1
// 右排前,返回1
// 相等返回0
if (left.isEmpty) {
if (right.isEmpty) {
return 0;
} else {
// 左空,右非空;左排前
return -1;
}
} else if (right.isEmpty) {
// 左非空,右空;右排前
return 1;
}
int leftSum = 0;
int rightSum = 0;
for (int i = 0, j = 0; i < left.length && j < right.length; ++i, ++j) {
final leftItem = left[i].toLowerCase();
final rightItem = right[j].toLowerCase();
final leftCode = leftItem.codeUnitAt(0);
final rightCode = rightItem.codeUnitAt(0);
final leftIsNum = isCode_num(leftCode);
final rightIsNum = isCode_num(rightCode);
if (leftIsNum != rightIsNum) {
// 一方是数值,一方非数值,将非数值放前
if (leftIsNum) {
// 左数值,右非数值;右排前
return -1;
} else {
// 左非数值,右数值;左排前
return 1;
}
} else {
if (leftIsNum) {
// 都是数值
for (; i < left.length; ++i) {
final item = left.codeUnitAt(i) - CODE_0;
if (item >= 0 && item <= 9) {
leftSum *= 10;
leftSum += item;
} else {
break;
}
}
for (; j < right.length; ++j) {
final item = right.codeUnitAt(j) - CODE_0;
if (item >= 0 && item <= 9) {
rightSum *= 10;
rightSum += item;
} else {
break;
}
}
} else {
// 都不是数值
if (leftSum != rightSum) {
// 前面已经积攒了数值,且不相等
return (leftSum - rightSum);
}
leftSum = 0;
rightSum = 0;
/// 判断中英文字符,尝试转为拼音进行比较
final leftPinyin = getFirstCharPinyin(
leftItem,
);
final rightPinyin = getFirstCharPinyin(
rightItem,
);
if (null != leftPinyin) {
// 左是中英文字符
if (null != rightPinyin) {
// 右 也是中英文字符
final result = leftPinyin.compareTo(rightPinyin);
if (result != 0) {
// 不相同
return result;
} else {
// 相同,进入下一次循环
continue;
}
} else {
// 右 非中英文字符
// 让右排前
return 1;
}
} else {
// 左 非中英文字符
if (null != rightPinyin) {
// 右 是中英文字符
// 让左排前
return -1;
}
}
/// 都不是中英文字符
final result = leftCode - rightCode;
if (result != 0) {
return result;
}
}
}
}
if (leftSum != rightSum) {
return leftSum - rightSum;
}
return (left.length - right.length);
}