Char для несоответствия последовательности строк в Java для символов Unicode

У меня есть метод, как показано ниже (пожалуйста, игнорируйте проблему оптимизации кода.) Этот метод заменяет символ Unicode (символы бенгали)

static String swap(String temp, char c) { Integer length=temp.length(); char[] charArray = temp.toCharArray(); for(int u=0;u<length;u++) { if(charArray[u]==c) { char g=charArray[u]; charArray[u]=charArray[u-1]; charArray[u-1]=g; } } String string2 = new String(charArray); return string2; } 

Во время отладки я получил значения charArray, как показано ниже: Введите описание изображения здесь
Обратите внимание, что символы находятся в упорядоченном формате, что я хочу.
Но после выполнения инструкции значение, хранящееся в переменной String, несовместимо. Как показано ниже: Введите описание изображения здесь
Я хочу показать строку как «রেরেরে», но она отображает «েরেরের», чего я не хочу. Скажите, пожалуйста, что я делаю неправильно.

Примечание. Я не знаю бенгали, но я знаю немного (или много, в зависимости от того, кого вы спрашиваете) об Unicode и о том, как Java поддерживает его. Ответ предполагает знание последнего, а не первого.

В соответствии с диаграммой রে Unicode 6.0 রে представляет собой комбинацию знака зависимой гласной (0x09C7) и согласного (0x09B0) и представляется в виде последовательности из двух символов в массиве символов.

Если вы получаете знак зависимой гласной в одиночку, в результирующей последовательности символов (и, следовательно, в строке), то ваша оптимизация, вероятно, будет кричащей, поскольку, как представляется, предполагается, что бенгальские символы в Юникоде могут быть представлены как один код Unicode или Одна переменная char в Java; Это приведет к сценарию, когда согласный будет заменен другим согласным, но зависимая гласная, предшествующая согласной, никогда не будет заменена.

Я думаю, что правильная оптимизация должна поэтому учитывать наличие зависимых гласных и сравнивать следующий согласный в дополнение к гласной, т. Е. Он должен сравнивать два символа в массиве символов, вместо сравнения отдельных символов. Это также может означать, что ваша сигнатура метода должна быть изменена, чтобы разрешить char[] вместо одного char , чтобы символы Бенгали могли быть заменены предполагаемым бенгальским символом вместо замены кодового слова Unicode на другой, Что и делается в настоящее время.

Замечания в других ответах на ArrayIndexOutofBoundsException действительны. Следующий пример, который использует ваш алгоритм замены символов, показывает, что не только ваш алгоритм некорректен, но вполне возможно исключение исключения:

 class CodepointReplacer { public static void main(String[] args) { String str1 = "রেরেরে"; /* * The following is a linguistically invalid sequence, * but Java does not concern itself with linguistical correctness * if the String or char sequence has been constructed incorrectly. */ String str2 = "েরেরের"; /* * replacement character র for our strings * It is not রে as one would anticipate. */ char c = str1.charAt(1); optimizeKookily(str1, c); optimizeKookily(str2, c); } private static void optimizeKookily(String temp, char c) { Integer length = temp.length(); char[] charArray = temp.toCharArray(); for (int u = 0; u < length; u++) { if (charArray[u] == c) { char g = charArray[u]; charArray[u] = charArray[u - 1]; //throws exception on second invocation of this method. charArray[u - 1] = g; } } } } 

Поэтому лучшей стратегией замены символов будет использование String.replace (вариант CharSequence ) или String.replaceAll , предполагая, что вы знаете, как использовать их с бенгальскими символами.

Проблема в

  for(int u=0;u<length;u++) { if(charArray[u]==c) { char g=charArray[u]; charArray[u]=charArray[u-1]; charArray[u-1]=g; } } See when u=0 what is the value of charArray[u-1] that is the index -1.Modify your for loop or just put the condition where u=0. 

Ваш код вызовет исключение IndexOutOfBound. Когда u = 0, charArray [u-1] = – 1.