Если я попытаюсь напечатать ch[0] или любой случайный символ отсортированного массива символов после использования Arrays.sort (), он выдаст пустой вывод, и, следовательно, вывод будет пустым, почему?

#java #arrays #sorting #output

Вопрос:

    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'amp;amp; 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'amp;amp; str.charAt(i)<='z')
          stri=stri ch[p  ];
        
          else
          stri=stri chy[q  ];
       }
       return stri;
    }
}
 

Комментарии:

1. не могли бы вы, пожалуйста, добавить вопрос или хотя бы какое-то объяснение к вашему коду?

2. Пожалуйста, проясните вашу конкретную проблему или предоставьте дополнительные сведения, чтобы точно указать, что вам нужно. Поскольку это написано в настоящее время, трудно точно сказать, о чем вы просите.

Ответ №1:

Ваш код в порядке. Проблема, которая возникает, заключается в том, что вы определили свои массивы длиной строки, поэтому, когда вы просматриваете и добавляете символы в массивы ch и chy, некоторые места могут быть пустыми, и при сортировке этого массива эти начальные пробелы будут в начале массива, и, таким образом, ch[0] даст пустое пространство.

Комментарии:

1. в строке нет пробелов, когда я печатаю ее в целом, она печатается правильно, просто определенные символы индекса не печатаются

Ответ №2:

Перед сортировкой ch и chy массивами необходимо обрезать их, чтобы удалить пустые ячейки с '' символами, например, с помощью метода 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' amp;amp; 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' amp;amp; 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' amp;amp; c <='z' ? ch[p  ] : chy[q  ]);
    }
    
    return sb.toString();
}

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

Выход:

 !dell,HloorW