如果我在使用 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.
在排序 ch
和 chy
数组之前,需要 trim 它们删除具有 '[=16=]'
个字符的空单元格,例如,使用方法 Arrays::copyOf
:
ch = Arrays.copyOf(ch, k);
chy = Arrays.copyOf(chy, l);
Arrays.sort(ch);
Arrays.sort(chy);
或者,p
和 q
应该使用特定的移位而不是 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
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.
在排序 ch
和 chy
数组之前,需要 trim 它们删除具有 '[=16=]'
个字符的空单元格,例如,使用方法 Arrays::copyOf
:
ch = Arrays.copyOf(ch, k);
chy = Arrays.copyOf(chy, l);
Arrays.sort(ch);
Arrays.sort(chy);
或者,p
和 q
应该使用特定的移位而不是 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