Java如何不使用java.util.Arrays实现字符串不区分大小写排序
解决方案
原代码的核心问题是直接比较字符的ASCII码值,而ASCII编码规则里所有大写字母(取值范围6590)都小于小写字母(取值范围97122),因此会出现所有大写字母整体排在小写字母前面的结果,不符合「不区分大小写排序、同字母大写在前」的需求。
调整思路如下:
- 比较两个字符的优先级时,先统一转为小写(或大写)做第一层比较,保证不同字母跨大小写按字母顺序排序
- 如果转成小写后值相等,说明是同一个字母的大小写形态,此时让大写字符排在前面即可
修改后可直接运行的代码:
String str = "bbDeaAcCc"; char[] strArr = str.toCharArray(); char temp = 0; for (int i = 0; i < str.length(); i++) { for (int j = 0; j < str.length(); j++) { // 统一转小写做第一层排序 char jLower = Character.toLowerCase(strArr[j]); char iLower = Character.toLowerCase(strArr[i]); if (jLower > iLower) { // 字母顺序靠后,交换位置 temp = strArr[i]; strArr[i] = strArr[j]; strArr[j] = temp; } else if (jLower == iLower) { // 同字母时大写排在前面:如果j位是小写、i位是大写则交换 if (Character.isLowerCase(strArr[j]) && Character.isUpperCase(strArr[i])) { temp = strArr[i]; strArr[i] = strArr[j]; strArr[j] = temp; } } } } // 输出验证:AabbCccDe System.out.println(new String(strArr));
Character属于java.lang包,是JDK默认导入的基础类,不需要额外引入包。如果你连Character类的方法都不想调用,也可以通过ASCII范围手动实现大小写判断:
- 转小写逻辑替换为:
c >= 'A' && c <= 'Z' ? c + 32 : c - 大写判断逻辑替换为:
c >= 'A' && c <= 'Z'
替换后完全不需要依赖任何JDK工具类,纯原生逻辑即可实现需求。
内容的提问来源于stack exchange,提问作者theroxkymountains
相关产品推荐
相关产品推荐

