如果我在使用 Arrays.sort() 后尝试打印 ch[0] 或排序字符数组的任何随机字符,它会给出空白输出,因此输出为空白,为什么?

If I try to print ch[0] or any random char of sorted char array after using Arrays.sort() it gives a blank output and thus the output is blank why?

   class Solution
{
    public static String caseSort(String str)
    {
       char ch[]=new char[str.length()];
       char chy[]=new char[str.length()];
       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;
    }
}

你的代码没问题。发生的问题是你已经用字符串的长度定义了你的数组,所以当你循环并在 ch 和 chy 数组中添加字符时,一些地方可能是空的,当你对这个数组进行排序时,那些初始的 spaces将位于数组的开头,因此 ch[0] 将给出一个空白 space.

在排序 chchy 数组之前,需要 trim 它们删除具有 '[=16=]' 个字符的空单元格,例如,使用方法 Arrays::copyOf:

ch  = Arrays.copyOf(ch,  k);
chy = Arrays.copyOf(chy, l);
       
Arrays.sort(ch);
Arrays.sort(chy);

或者,pq 应该使用特定的移位而不是 0 进行初始化 - 如果 ch 包含 k 小写字母,则int p = ch.length - k;q = chy.length - l;

此外,如果使用StringBuilder来连接循环中的字符会更好。

int p = ch.length - k, q = chy.length - l; 
StringBuilder sb = new StringBuilder(str.length());

for (int i = 0; i < str.length(); i++) {
    if (str.charAt(i) >= 'a' && str.charAt(i) <= 'z')
        sb.append(ch[p++]);
    else
        sb.append(chy[q++]);
}
return sb.toString();

具有更多重构和测试的完整代码:

public static String caseSort(String str) {
    if (str == null || str.isEmpty()) {
        return str;
    }
    
    int n = str.length();
    
    char ch[]  = new char[n];
    char chy[] = new char[n];
    int k = 0, l = 0;
       
    for (char c : str.toCharArray()) {
        if (c >= 'a' && c <='z')
            ch [k++] = c;
        else
            chy[l++] = c;
    }
//  ch  = Arrays.copyOf(ch,  k);
//  chy = Arrays.copyOf(chy, l);
       
    Arrays.sort(ch);
    Arrays.sort(chy);

    int p = ch.length - k, q = chy.length - l; 
    StringBuilder sb = new StringBuilder(n);

    for (char c : str.toCharArray()) {
        sb.append(c >= 'a' && c <='z' ? ch[p++] : chy[q++]);
    }
    
    return sb.toString();
}

//  Test
System.out.println(caseSort("Hello,World!"));

输出:

!dell,HloorW