Логическая ошибка с выводом символов подчеркивания Java

Я хочу создать код, который выводит все в строке «вещь» в виде подчеркивания, кроме букв, которые сохранены в guessChar. В настоящее время код добавляет поверх себя. Может ли кто-нибудь помочь мне с этой логической ошибкой? В настоящее время код содержит длинные строки подчеркивания. Желаемый результат - «_e___ _____ E».

String thing  = "Hello World E";
String phrase = "";
String guessChar = "e";
String phraseCorrectGuessList = "";
boolean l = true;

String alphabet = "abcdefghijklmnopqrstuvwxyz";//String that holds the alphabet that is later used as indexing
phrase = thing.toLowerCase();//String that holds the phrase (lower case)
String hiddenPhrase = "";//String that holds the parts of the phrase that has not yet been unvealed
String phraseOnlyChar = "";//String that holds phrase without all the punctuation
String hiddenPhraseOnlyChar = "";//String that hold the parts of the phrase that has not yet been unvealed without all the punctuation

for (int i = 0; i < thing.length(); i++){
  for (int pos = 0; pos < phrase.length(); pos++){//for loop that checks if there is a space or not
    if (alphabet.indexOf(phrase.charAt(pos)) >= 0){//if there is a letter
      hiddenPhrase = hiddenPhrase + "_ ";//saves to hidden phrase (changes letters to underscrore)
      phraseOnlyChar += phrase.charAt(pos);
    }//end of if
    else{
      hiddenPhrase = hiddenPhrase + phrase.charAt(pos) + " ";//saves area as punctuation
    }//end of else
  }//end of for loop

  if (phrase.indexOf(guessChar) >= 0){//if user enters in a consonant that is in the phrase
    System.out.println("Congratulations, you are correct");//prints out that the user guessed correctly
    phraseCorrectGuessList += guessChar;//adds character to correctly guessed letters string

    System.out.println(hiddenPhrase);//prints the phrase that is hidden
  }

  for (int count = 0; count < phrase.length(); count++){//for loop that goes through every letter in the phrase checks to see if the user inputted character is any character in the phrase
    if (alphabet.indexOf(phrase.charAt(count)) >= 0 && phraseCorrectGuessList.indexOf(phrase.charAt(count)) < 0){//if user inputted character isn't in the phrase
      hiddenPhrase = hiddenPhrase + "_ ";//saves hidden phrase as is
    }//end of if

    else{//if user inputted character is in the phrase
      hiddenPhrase = hiddenPhrase + phrase.charAt(count) + " ";//saves hidden phrase but with all instances of that character revealed
    }//end of else

  }//end of for loop

  for (int index = 0; index < hiddenPhrase.length(); index++){
    if (alphabet.indexOf(hiddenPhrase.charAt(index)) >= 0){
      hiddenPhraseOnlyChar += hiddenPhrase.charAt(index);
    }

  }

}

Не могли бы вы прояснить описание вашей проблемы? Кроме того, можете ли вы добавить желаемые и фактические выходы для некоторых входных данных?

user2956272 20.12.2018 01:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
95
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Хотя я не на 100% то, что вы спрашиваете конкретно о вашем коде, я могу сделать то, что вы задаете в заданном вами вопросе. В будущем подумайте о том, чтобы сделать код для ваших вопросов более лаконичным.

У вас должно быть «текущее слово», поскольку я предполагаю, что вы делаете игру в палача. Возьмите это текущее слово, превратите его в массив символов и проверьте каждый символ в массиве, чтобы увидеть, содержит ли он пробел. Это создает пробелы.

    toBeBlankArray = currentWord.toCharArray();
    for(int x = 0; x < toBeBlankArray.length; x++)
    {
        if (toBeBlankArray[x] != ' ')//ensures that spaces don't become underscores
        {
            toBeBlankArray[x] = '_';
        }
    }

Когда пользователь угадывает букву, вам нужно угадать и перебрать массив, чтобы получить логический массив для проверки совпадений. Если вы сделаете это в методе, это будет выглядеть так.

public static boolean[] checkArrayForMatches(String currentWord, char charToTest)//this generates a boolean array in response to the user's guess against the current word
{

    String upperCaseCurretWord = currentWord.toUpperCase();
    char[] currentWordArray = upperCaseCurretWord.toCharArray();//I made this part to avoid confusion due to case sensitivity
    boolean[] returnArray = new boolean[currentWordArray.length];

    for(int x = 0; x < returnArray.length; x++)
    {
        char characterInArray = currentWordArray[x];
        if (characterInArray == charToTest)
        {
            returnArray[x] = true;
        }
        else 
        {
            returnArray[x] = false;
        }       
    }
    return returnArray;
}

Затем вы сравниваете свой массив истина-ложь с начальным словом, как показано ниже. Я назвал свое начальное слово toBeBlankArray. Вы также должны создать переменную для хранения логического массива для проверки предположения пользователя. Я назвал свой "isArrayRight"

boolean[] isArrayRight = checkArrayForMatches(currentWord, charToSend);

//takes the blanks and fills in the letter if guess was correct
        for(int x = 0; x < isArrayRight.length; x++)
        {
            if (isArrayRight[x] == true)
            {
                toBeBlankArray[x] = currentWordArray[x];
            }
        }

Вам придется добавить некоторые условия и контекст, но это основной код для проверки символа на массиве символов.

У вас слишком много кода для того, что вы пытаетесь сделать.

Попробуй это:

String hidden = thing.replaceAll("(?i)[^ " + guessChar + "]", "_");

Нарушение регулярного выражения:

  • (?i) означает "игнорировать регистр"
  • [^...] - это отрицательный класс символов, то есть символы, которые являются нет в списке, в данном случае это пробел cahr и символы предположения.

Это будет работать с guessChar, содержащим несколько символов.


Вот тестовый код:

String thing  = "Hello World E";
String guessChar = "ewo";
String hidden = thing.replaceAll("(?i)[^ " + guessChar + "]", "_");
System.out.println(hidden);

Вывод:

_e__o Wo___ E

OP хочет, чтобы отображался пробел

preciousbetine 20.12.2018 01:50

@preciousbetine, спасибо. не заметил этого. код исправлен, чтобы сохранить пробелы.

Bohemian 20.12.2018 01:52
Ответ принят как подходящий

На самом деле есть гораздо более простой способ сделать это, используя,

public static void main(String[] args) {
    String thing  = "Hello World E";
    String phrase = "";
    char guessChar = 'e';
    String finalstr = "";
    phrase = thing.toLowerCase();
    for (int i = 0; i < thing.length(); i++){
        char test = phrase.charAt(i);
        if (test == ' ') 
        {
            finalstr += " ";
        }
        else if (test == guessChar)
        {
            finalstr += thing.charAt(i);
        }
        else 
        {
            finalstr += "_";
        }
    }
    System.out.println(finalstr);
}

Вывод

_e___ _____ E

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