版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1115094858/article/details/84849289
需排序字段 如: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 的代码,略做修改。原文地址:https://blog.csdn.net/Tuzi294/article/details/70199210
/** * 将中文数字转换为 阿拉伯数字 * @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); }