char [] to Строковое несоответствие последовательности в Java для символов Unicode - PullRequest
3 голосов
/ 20 июля 2011

У меня есть метод, подобный приведенному ниже (пожалуйста, игнорируйте проблему оптимизации кода.) Этот метод заменяет символ 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, как показано ниже: enter image description hereобратите внимание, что символы в последовательном формате, что я хочу.Но после выполнения оператора значение, сохраненное в переменной String, не соответствует.как ниже: enter image description here Я хочу отобразить строку как «রেরেরে», но она отображает «েরেরের», чего я не хочу.Пожалуйста, скажите мне, что я делаю неправильно.

Ответы [ 3 ]

6 голосов
/ 20 июля 2011

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

0 голосов
/ 20 июля 2011

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

0 голосов
/ 20 июля 2011

проблема в

    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.
...