Примечание. Я не знаю бенгали, но я знаю немного (или многое, в зависимости от того, кого вы спрашиваете) о Юникоде и о том, как его поддерживает 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
, при условии, что вы знаете, как использовать их с бенгальскими символами.