compareExtend static method

int compareExtend(
  1. String left,
  2. String right
)

扩展名称排序

  • 支持数值排序
    • 得到 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);
}