Java - заменить символ в строке

Не думаю, что я не искал в Интернете ответа. Почему это дает мне ошибку outofbounds?

У меня есть две строки из 6 символов. Один из них - "Даниил", а другой - "------". Пользователь вводит персонажа. Цикл проходит через строку "daniel" и проверяет char по char, если они совпадают с пользовательским вводом. Если он совпадает, он должен заменить угаданный символ символом "------". Поэтому, если вы введете "a", он должен вывести "-a ----", и цикл продолжится. Затем, если вы введете "e", он должен вывести "-a - e-" и т. Д. Код не содержит ошибок компиляции или каких-либо предупреждений и также имеет смысл. Я попробовал подстроку и заменить, но это проще и короче. Я попытался отладить его, но он не дает никакой полезной информации. Я не знаю, почему он возвращает ошибку outofbounds.

package hello.world;

import java.util.Scanner;

public class HelloWorld {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        String word="daniel";
        StringBuilder guess2 = new StringBuilder("------");
        char guess;

        System.out.println("**********************");
        System.out.println("* Welcome to Hangman *");
        System.out.println("**********************");

        for (int i=0;i<10;i++) {
            System.out.print("Enter a letter: ");
            guess=in.nextLine().charAt(0);

            for (int j=0;i<word.length();j++) {
                if (guess==word.charAt(j)) {
                    guess2.setCharAt(word.charAt(j), guess);
                    System.out.print(guess2);
                }
            }
        }
    }
}

Выход:

**********************
* Welcome to Hangman *
**********************
Enter a letter: a
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 97
    at java.lang.AbstractStringBuilder.setCharAt(AbstractStringBuilder.java:380)
    at java.lang.StringBuilder.setCharAt(StringBuilder.java:76)
    at hello.world.HelloWorld.main(HelloWorld.java:22)
Java Result: 1
BUILD SUCCESSFUL (total time: 2 seconds)

3 ответа

Решение

Замещать

guess2.setCharAt(word.charAt(j), guess);

с

guess2.setCharAt(j, guess);

Первый параметр - это индекс символа, который нужно заменить в StringBuilder, а не сам персонаж.

Кроме того, кажется, что в for использование цикла i вместо j,

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

String.length() возвращает длину строки, начиная с 1, а не с 0. Поэтому всякий раз, когда вы используете String.length(), всегда используйте символ меньше (<).

Вместо использования String builder Вы можете просто заменить все, используя метод regex + replaceAll

for (int i=0;i<10;i++) {
        System.out.print("Enter a letter: ");
        guess=in.nextLine().charAt(0);

        word = word.replaceAll("[^"+ guess +"]", "-");
        System.out.println(word);
    }

результат:

Enter a letter: a
-a----
Другие вопросы по тегам