Поиск более одного вхождения буквы в объекте StringBuilder

Я пытаюсь создать программу Hangman... наряду с другими проблемами, я не могу найти или создать метод для поиска более одного вхождения письма и заменить все найденные вхождения. Я возился с методом findAndReplace(), пытаясь решить эту проблему... это не сработало. пожалуйста, кто-нибудь может мне помочь

public class Hangman {


static Scanner sc = new Scanner(System.in);
        static final int MAXTRYS = 10;
        static int numError = 0;
        static boolean FINSHED = false;
        String s;
        String input;
        String tW;
        int pos;


        public static void main(String[] args) {
            System.out.println("Welcome to the Hangman App" + "\n");
            String s = answerKey();
            StringBuilder AnswerKey = dashReplace(s);




            while(!FINSHED && numError < MAXTRYS){
            //get user input and cast to char
            System.out.println("Enter an Letter: ");
            String input = sc.nextLine();
            char ch = input.charAt(0);


            int pos = findAndReplace(s, AnswerKey, input, ch);
            int index = AnswerKey.indexOf("-");
            if(pos == -1){
                numError++;
                continue;
            }else if(index == -1){
                FINSHED = true;
                System.out.println("you won!");
            }
            }

        }


        public static int findAndReplace(String s, StringBuilder AnswerKey,
                String input, char ch) {
            //find position of user input and replace
            int pos = s.indexOf(input);
            AnswerKey.setCharAt(pos, ch);
           // while(pos > 0) {
           //    AnswerKey.setCharAt(pos, (char) (ch+1));
            //}
            System.out.println(AnswerKey);
            return pos;
        }


        public static StringBuilder dashReplace(String s) {
            //replace non-white space char with dashes and creates StringBuilder Object
            String tW = s.replaceAll("\\S", "-"); 
            System.out.print(tW + "\n");  
            StringBuilder AnswerKey = new StringBuilder(tW);
            return AnswerKey;
        }


        public static String answerKey() {
            //get random array element
            String array[] = new String[10];
            array[0] = "Hamlet";
            array[1] = "Mysts of Avalon";
            array[2] = "The Iliad";
            array[3] = "Tales from Edger Allan Poe";
            array[4] = "The Children of Hurin";
            array[5] = "The Red Badge of Courage";
            array[6] = "Of Mice and Men";
            array[7] =  "Utopia"; 
            array[8] =  "Chariots of the Gods";
            array[9] =  "A Brief History of Time";

            ArrayList<String> list = new ArrayList<String>(Arrays.asList(array));
            Collections.shuffle(list);
            String s = list.get(0);
            //for testing
            System.out.println(s);
            return s;
        }

}

2 ответа

Решение

Типичный цикл поиска и замены выглядит следующим образом:

// Search starts at pos+1, so we set pos to -1 to start search at zero
int pos = -1;
// We'll break out of the loop when there are no further matches
while (true) {
    // Look for the desired character starting one character past the pos
    pos = s.indexOf(input, pos+1);
    // If the character is not found, end the loop
    if (pos < 0) break;
    // Otherwise, replace the character
    s.setCharAt(pos, ch);
}

Смотрите комментарии в коде выше, чтобы понять, что происходит.

Кажется, самое простое решение - это трансформировать StringBuilder к String, использовать replace() метод, а затем просто заменить StringBuilder с новым:

answerKey = new StringBuilder(answerKey.toString().replace(charToReplace, newChar));
Другие вопросы по тегам