调用Arrays.sort()排序字符数组后打印元素输出空白是什么原因
问题原因
- 你初始化存储小写字母的
ch数组、存储大写字母的chy数组时,直接将长度设为原字符串的总长度,而实际只会填充前k位(小写字母数量)和前l位(大写字母数量),数组剩余未填充的位置默认值为\u0000(ASCII码为0的空字符)。 - 调用
Arrays.sort()对整个数组排序时,空字符的ASCII码远小于大小写字母,会被排到数组最前面,因此你取ch[0]等靠前位置的元素时拿到的都是空字符,打印显示为空白,最终拼接的结果自然也包含大量空字符、看起来是空的。
修复方案
你可以选择任意一种方式修改:
方案1:仅排序数组已填充的区间
调用Arrays.sort的重载方法,指定排序的起止索引,跳过未填充的空字符区域,改动最小:
// 把原来的全数组排序逻辑替换为下面两行即可 Arrays.sort(ch, 0, k); Arrays.sort(chy, 0, l);
方案2:初始化数组时就使用正确的长度
先统计大小写字母的数量,再创建对应长度的数组,从根源避免空字符的存在:
class Solution { public static String caseSort(String str) { // 先统计大小写字母数量 int lowerCnt = 0, upperCnt = 0; for(int i=0;i<str.length();i++) { if(str.charAt(i)>='a'&& str.charAt(i)<='z') lowerCnt++; else upperCnt++; } // 按实际容量初始化数组 char ch[]=new char[lowerCnt]; char chy[]=new char[upperCnt]; int k=0,l=0; for(int i=0;i<str.length();i++) { if(str.charAt(i)>='a'&& str.charAt(i)<='z') ch[k++]=str.charAt(i); else chy[l++]=str.charAt(i); } Arrays.sort(ch); Arrays.sort(chy); int p=0,q=0; String stri=""; for(int i=0;i<str.length();i++) { if(str.charAt(i)>='a'&& str.charAt(i)<='z') stri=stri+ch[p++]; else stri=stri+chy[q++]; } return stri; } }
内容的提问来源于stack exchange,提问作者Priyanshi
相关产品推荐
相关产品推荐

