Java: как исправить «Индекс строки вне диапазона: #»?

Я пытаюсь зашифровать две случайные буквы строки, которая не является первой буквой или двумя последними. При компиляции получаю ошибку "String index out of range". Я пробовал много разных решений, но ничего не работает.

Для этого назначения мы должны использовать метод и команды .charAt. Я попытался создать переменные для двух случайных символов, а затем добавить их обратно в перевернутую строку, но не смог заставить это работать.

public static String scramble(String input) {
    int range = input.length() - 3;
    int place = (int)(Math.random() * range);
    String newWord = "";
    newWord = input.substring(0, place);
    newWord = newWord + newWord.charAt(place) + 2;
    newWord = newWord + newWord.charAt(place) + 1;

    return newWord;

Я ожидаю вывод строки с двумя зашифрованными символами. Например, «Fantastic» будет «Fantastic» или «Fnatastic».

Перед вызовом .charAt убедитесь, что значение «место» не превышает длину строки.

kosa 26.03.2019 17:36

Почему вы получаете ошибку при компиляции?

Amit 26.03.2019 17:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
486
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы делаете :

newWord = input.substring(0, place);

Таким образом, индексы внутри newWord идут от 0 до place-1
. Затем вы делаете:

newWord.charAt(place);

Но этот индекс не существует в вашей строке. Это Out of Bound

См. документ

Когда вы создаете newWord = input.substring(0, place), в нем ровно place символов. Вы не можете запросить charAt(place) у него, последний символ находится в place-1.

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

String input = "Fantastic";

// random constraints
int min = 1;
int max = input.length() - 3;

// random two characters to swap
int from = min + (int) (Math.random() * max);
int to;
do {
    to = min + (int) (Math.random() * max);
} while (to == from); // to and from are different

// swap to and from in chars
char[] chars = input.toCharArray();
char tmp = chars[from];
chars[from] = chars[to];
chars[to] = tmp;
String result = new String(chars);

System.out.println(result); // Ftntasaic

можешь попробовать

  public static String scramble(String input) {
    if (input.length() >3){
        int range = input.length() - 3;
        int place  = 1+   new Random().nextInt(range) ;
        input=input.substring(0, place) +input.charAt(place  + 1)+input.charAt(place) +input.substring( place+2);

    }
    return input;
}

ввод: Фантастический вывод: Фанатик, Фанастик, Фанатстик

Ответ принят как подходящий

Попробуйте что-то вроде этого:

public static String scramble(String input) {
    int range = input.length() - 3;
    int place = (int)(Math.random() * range);
    String newWord = input.substring(0, place);
    newWord = newWord + input.charAt(place + 1);
    newWord = newWord + input.charAt(place);
    // if you need the whole input, just 2 characters exchanged, uncomment this next line
    // newWord = newWord + input.substring(place + 2, range);
    return newWord;
}

Другие вопросы по теме