【Java】 包含中文数字的文字排序

需排序字段 如:XX八十一局, XX十二局, XX三十四局, XX四局, XX五局, XX一百零六局, XX七局
期望排序结果:XX四局, XX五局, XX七局, XX十二局, XX三十四局, XX八十一局, XX一百零六局

思路:截取 各个字符串的中文数字部分,然后将其转换为阿拉伯数字后进行比较。

截取中文字符串 方法:

 

/**
 * 截取第一处的中文数字字符串
 * @param str
 * @return
 */
private static String getNumberStr(String str) {
    StringBuilder stringBuilder = new StringBuilder();
    boolean isFirst = true;
    String chineseNumStr="零一二三四五六七八九十百千万亿";
    for (int i = 0; i < str.length(); i++) {
        String tempStr = str.substring(i, i + 1);
        if (chineseNumStr.contains(tempStr)){
            stringBuilder.append(tempStr);
            if (isFirst) {
                isFirst = false;
            }
        } else {
            if (!isFirst) {
                break;
            }
        }
    }
    return stringBuilder.toString();
}

将中文数字转换为 阿拉伯数字,这里用的是 Tuzi294 的这篇文章的代码,略做修改。

/**
 * 将中文数字转换为 阿拉伯数字
 * @author Tuzi294
 * @param chineseNumber 中文数字字符串
 * @return 转换后的阿拉伯数字
 */
public static long chineseNumber2Int(String chineseNumber) {
    String aval = "零一二三四五六七八九";
    String bval = "十百千万亿";
    int[] bnum = {10, 100, 1000, 10000, 100000000};
    long num = 0;
    char[] arr = chineseNumber.toCharArray();
    int len = arr.length;
    Stack<Integer> stack = new Stack<Integer>();
    for (int i = 0; i < len; i++) {
        char s = arr[i];
        //跳过零
        if (s == '零') continue;
        //用下标找到对应数字
        int index = bval.indexOf(s);
        //如果不在bval中,即当前字符为数字,直接入栈
        if (index == -1) {
            stack.push(aval.indexOf(s));
        } else { //当前字符为单位。
            int tempsum = 0;
            int val = bnum[index];
            //如果栈为空则直接入栈
            if (stack.isEmpty()) {
                stack.push(val);
                continue;
            }
            //如果栈中有比val小的元素则出栈,累加,乘N,再入栈
            while (!stack.isEmpty() && stack.peek() < val) {
                tempsum += stack.pop();
            }
            //判断是否经过乘法处理
            if (tempsum == 0) {
                stack.push(val);
            } else {
                stack.push(tempsum * val);
            }
        }
    }
    //计算最终的和
    while (!stack.isEmpty()) {
        num += stack.pop();
    }
    return num;
}

调用方法

public static void main(String[] args) {
    List<String> data = Arrays.asList("XX八十一局", "XX十二局", "XX三十四局", "XX四局", "XX五局", "XX一百零六局", "XX七局");
    System.out.println(data);
    //按中文数字重新排序
    data.sort((o1, o2) -> {
        String str1 = o1;
        String str2 = o2;
        str1 = getNumberStr(str1);
        str2 = getNumberStr(str2);
        return (int) (chineseNumber2Int(str1) - chineseNumber2Int(str2));
    });
    System.out.println(data);
}
相关推荐
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页