Почему я продолжаю получать эту ошибку индексации? - PullRequest
0 голосов
/ 13 мая 2019

Я получаю StringIndexOutOfBoundsException.Я пытаюсь взять строку и заменить каждую букву буквой после нее, а затем вернуть новую обработанную строку.Например, «Эй», это «Ифз».

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

String change = "";
char[] alpha =  {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};


 for(int i = 0; i < alpha.length; i++) {

    if(str.charAt(i) == alpha[i]) {
        change += alpha[i+1] + "";
    }


    }

    return change;

  } 

  public static void main (String[] args) {  
    // keep this function call here     
    Scanner s = new Scanner(System.in);
    System.out.print(LetterChanges(s.nextLine())); 
  }   

 Error Message:

 Exception in thread "main" java.lang.StringIndexOutOfBoundsException:    

String index out of range: 18
at java.lang.String.charAt(String.java:658)
at Main.LetterChanges(Main.java:11)
at Main.main(Main.java:25)

Ответы [ 3 ]

1 голос
/ 13 мая 2019

Проблема в том, что длина str может быть меньше 26 (поскольку вы перебираете альфа-список), поэтому str.charAt(i) сгенерирует исключение. Если ваша строка гарантирует, что она состоит только из букв ASCII, то один из способов ее реализации:

String getChange(String str){
     StringBuilder change = new StringBuilder();
     for (int i = 0; i < str.length(); i++){
        char c = str.charAt(i);
        int nextCharPos ;
        if ('a' <= c && c <= 'z')
            nextCharPos = ((int) ('a')) + ((c - 'a') + 1) % 26;
        else if ('A' <= c && c <= 'Z')
            nextCharPos = ((int) ('A')) + ((c - 'A') + 1) % 26;
        else {
            change.append(c);
            continue;
        }
        char nextChar = (char)(nextCharPos);
        change.append(nextChar);
     }
     return change.toString();
}
0 голосов
/ 13 мая 2019
private static String LetterChanges(String str) {
    String change = "";
    char[] alpha = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
            't', 'u', 'v', 'w', 'x', 'y', 'z' };

    for(int i = 0 ; i < str.length() ; i++) {
        change = change.concat(Character.toString(getNextChar(str.charAt(i), alpha)));
    }
    return change;
}

private static char getNextChar(char eachChar, char[] alpha) {
    int charIndex = -1;
    for(int i = 0 ; i < alpha.length ; i++) {
        if(alpha[i] == eachChar) {
            charIndex = i;
            break;
        }
    }
    if(charIndex != -1) {
        //To handle the last indexed char 
        if(charIndex == alpha.length-1) {
            return alpha[0];
        } else {
            return alpha[charIndex+1];
        }
    }
    //default for unknown character
    return '-';
}

Этот код ограничивает входную строку элементами альфа-массива, и все, что находится за пределами массива, будет по умолчанию равным '-'.Этот код также будет циклически повторять элементы, т.е. «z» на входе будет заменено на «a».

0 голосов
/ 13 мая 2019
  1. , если str меньше 26 (длина альфа), тогда str.charAt (i) выдаст ошибку.
  2. alpha [i + 1], если i 25, то alpha [i + 1] = альфа [26], которая не существует и снова выдает ошибку
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...