Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果Java中存在多个相同字符,则替换字符串中的字符_Java_String - Fatal编程技术网

如果Java中存在多个相同字符,则替换字符串中的字符

如果Java中存在多个相同字符,则替换字符串中的字符,java,string,Java,String,所以我已经学习Java一个多月了,我正在制作一个hang-man游戏,但是我在替换字符串中的字符时遇到了麻烦。我已经写好了,所以你有两个字符串,一个叫做“word”,其中包含要猜测的单词,另一个叫做“clone”,它是单词的克隆,用下划线替换所有字符。然后,当您猜测一个字母时,它会检查字符串“word”以确保它包含该字母,如果包含该字母,它会用该字母替换“clone”中的下划线 while (this.guessesLeft >= 0) { char letter; int

所以我已经学习Java一个多月了,我正在制作一个hang-man游戏,但是我在替换字符串中的字符时遇到了麻烦。我已经写好了,所以你有两个字符串,一个叫做“word”,其中包含要猜测的单词,另一个叫做“clone”,它是单词的克隆,用下划线替换所有字符。然后,当您猜测一个字母时,它会检查字符串“word”以确保它包含该字母,如果包含该字母,它会用该字母替换“clone”中的下划线

while (this.guessesLeft >= 0) {
    char letter;
    int letterIndex;

    getGuess();

    if(this.word.contains(this.letterGuessed)) {
        StringBuilder newString = new StringBuilder(this.clone);

        letterIndex = this.word.indexOf(this.letterGuessed);
        letter = this.word.charAt(letterIndex);

        newString.setCharAt(letterIndex, letter);
        this.clone = newString.toString();
    } else {
        this.guessesLeft--;
    }
    printGameBoard(); 
}

我遇到的问题是,如果你猜一个字母,字符串包含两个字符,它只显示一个。例如,如果使用了单词“burrito”,这里是我的输出


我该如何编辑我的游戏逻辑,以便在猜到字母“r”时,它将两个r都放在字符串中,而不仅仅是一个?提前感谢您的帮助

您需要查找信函的所有索引,然后将其全部替换。 目前你只寻找第一个

要查找所有索引,请查找字母的第一个匹配项,如果找到一个(indexOf返回正值),请使用该方法从最后一个位置继续查找,直到找到所有索引(indexOf返回-1)

以下是一个例子:

if(this.word.contains(this.letterGuessed)) {

    // look for an occurrence, 
    // if you have one, keep looking for others until you have them all (ie: index = -1)
    List<Integer> indexes = new ArrayList<>();
    int index = this.word.indexOf(this.letterGuessed);
    while (index >= 0) { // <- that will loop until the indexOf returns a -1
        indexes.add(index);
        index = this.word.indexOf(this.letterGuessed, index+1);
    }

    // replace at all the found indexes
    StringBuilder newString = new StringBuilder(this.clone);
    for(int letterIndex : indexes) {
        char c = this.word.charAt(letterIndex);
        newString.setCharAt(letterIndex, c);
    }

    this.clone = newString.toString();

} else {
    this.guessesLeft--;
}

继续您当前的示例,如果用户再次提供“i”,会发生什么情况?他是失败了还是什么都没发生?你只是用
indexOf(int ch)
搜索该角色的第一个实例。还有一个版本接受开始搜索的索引,
indexOf(int ch,int fromIndex)
。你需要循环这个,直到你到达字符串的末尾,或者没有更多的字符实例(返回的索引是
-1
)。@Aaron你是对的,用户将失去一个回合,我只是还没走到那一步哈哈。我想先解决这个字符串问题。我觉得在这种情况下,字符数组更容易使用,您不需要
StringBuilder
或担心
string
的不稳定性(
string.tocharray()
将是获得它的简单方法)。
if(this.word.contains(this.letterGuessed)) {

    // look for an occurrence, 
    // if you have one, keep looking for others until you have them all (ie: index = -1)
    List<Integer> indexes = new ArrayList<>();
    int index = this.word.indexOf(this.letterGuessed);
    while (index >= 0) { // <- that will loop until the indexOf returns a -1
        indexes.add(index);
        index = this.word.indexOf(this.letterGuessed, index+1);
    }

    // replace at all the found indexes
    StringBuilder newString = new StringBuilder(this.clone);
    for(int letterIndex : indexes) {
        char c = this.word.charAt(letterIndex);
        newString.setCharAt(letterIndex, c);
    }

    this.clone = newString.toString();

} else {
    this.guessesLeft--;
}
if(this.word.contains(this.letterGuessed)) {
    StringBuilder newString = new StringBuilder(this.clone);

    int index = this.word.indexOf(this.letterGuessed);
    while (index >= 0) {
        char c = this.word.charAt(index);
        newString.setCharAt(index, c);
        index = this.word.indexOf(this.letterGuessed, index+1);
    }

    this.clone = newString.toString();
    System.out.println("clone = " + clone);
} else {
    this.guessesLeft--;
}