Эта программа о сжатии строк в Java - PullRequest
0 голосов
/ 04 июня 2018

Я новичок в кодировании, поэтому, пожалуйста, помогите мне решить эту проблему. Я установил входную строку s от пользователя и объявил переменную типа StringBuilder sb и integerесли 'условие:

for (int i=0;i<s.length();i++) {
    consec++;
    if(s.charAt(i)!=s.charAt(i+1) || i+1>=s.length()) {
        sb.append(s.charAt(i));
        sb.append(consec);
        consec=0;
    }
}

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Это потому, что на последней итерации цикла вы обращаетесь к элементу, которого нет в массиве (индекс больше, чем размер массива), поэтому попробуйте это:

for(int i=0;i<s.length()-1;i++){    //<<See this
    //your logic
}

Когда длинаСтрока чётная, вам нужно явно проверять крайний регистр после цикла for.Например,

for(int i=0;i<s.length()-1;i++){    //<<See this
    //your logic
}
if(s.length()%2==0){
    //your logic when length is even and loop has ignored last character.
}
0 голосов
/ 04 июня 2018

Java всегда оценивает слева направо.Итак, это:

s.charAt(i)!=s.charAt(i+1) || i+1>=s.length()

Оценивает s.charAt(i+1) до того, как проверит i+1>=s.length().Когда i+1 >= s.length(), s.charAt(i+1) потерпит неудачу, потому что он находится за концом строки.

Обратный порядок операндов:

i+1>=s.length() || s.charAt(i)!=s.charAt(i+1)

Поскольку || является коротким-circuiting оператор, это оценивает s.charAt(i)!=s.charAt(i+1) только если i+1>=s.length() ложно, поэтому он не завершится с исключением в этом случае.

0 голосов
/ 04 июня 2018

Рассмотрим строку,

String s = "abcd";

Ваш цикл будет выполняться с 0 -> s.length () - 1, т. Е. С 0 -> 3. Поэтому, когда вы будете иметь индекс 3, i+1=4Таким образом, s.charAt (i + 1) выбрасывает исключение за пределами границ, так как 4 выше индекса массива.Поэтому либо выполните цикл от i -> 0 to i < s.length()-1.Или измените существующий код на следующий:

for(int i=0;i<s.length();i++)
{
    consec++;
    if(i+1<s.length() && s.charAt(i)!=s.charAt(i+1))
    {
        sb.append(s.charAt(i));
        sb.append(consec);
        consec=0;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...