Я пытаюсь зашифровать две случайные буквы строки, которая не является первой буквой или двумя последними. При компиляции получаю ошибку "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».
Почему вы получаете ошибку при компиляции?




Вы делаете :
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;
}
Перед вызовом .charAt убедитесь, что значение «место» не превышает длину строки.