Java Как избежать String Index вне границ - PullRequest
0 голосов
/ 29 августа 2018

У меня есть следующая задача:

Вернуть true, если строки «кошка» и «собака» отображаются с одинаковым номером раз в данной строке.

catDog ("catdog") → true catDog ("catcat") → false catDog ("1cat1cadodog") → true

мой код:

public boolean catDog(String str) {
int catC = 0;
int dogC = 0;
if(str.length() < 3) return true;
for(int i = 0; i < str.length(); i++){
   if(str.charAt(i) == 'd' && str.charAt(i+1) == 'o' && str.charAt(i+2)  == 'g'){
     dogC++;
   }else if(str.charAt(i) == 'c' && str.charAt(i+1) == 'a' && 
                                       str.charAt(i+2) == 't'){
    catC++;
  }
}

if(catC == dogC) return true;
return false;
}

Но для catDog("catxdogxdogxca")false я получаю StringIndexOutOfBoundsException. Я знаю, что это вызвано предложением if, когда он пытается проверить, равно ли charAt(i+2) т. Как я могу избежать этого? Спасибо с уважением:)

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Есть проблема с логикой, условные операторы пытаются получить доступ к символу, размер которого не соответствует строковому значению.

Ввод: catxdogxdogxca имеет в конце ca , поэтому выполняется блок else , который пытается получить символ, присутствующий в i + 3, который не существует на входе. Вот почему вы видите java.lang.StringIndexOutOfBoundsException .

0 голосов
/ 29 августа 2018
for(int i = 0; i < str.length(); i++){ // you problem lies here
   if(str.charAt(i) == 'd' && str.charAt(i+1) == 'o' && str.charAt(i+2)  == 'g')

Вы используете i < str.length() в качестве условия завершения цикла , но вы используете str.charAt(i+1) и str.charAt(i+2)

Поскольку вам необходимо получить доступ к i+2, вам следует ограничить диапазон i < str.length() - 2.

for(int i = 0, len = str.length - 2; i < len; i++) 
// avoid calculating each time by using len in initialising phase;
...