【问题标题】:Replace characters in string if there a multiple of the same character in Java如果Java中有多个相同的字符,则替换字符串中的字符
【发布时间】:2020-02-28 13:35:12
【问题描述】:

所以我已经学习 Java 一个多月了,我正在制作一个刽子手游戏,但是我在替换字符串中的字符时遇到了麻烦。我写了它,所以你有两个字符串,一个称为“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”这个词,这是我的输出。

Guess a letter: r
bur____ 
You have 5 guess left before you die!

Guess a letter: i
bur_i__ 
You have 5 guess left before you die!

Guess a letter: r
bur_i__ 
You have 5 guess left before you die!

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

【问题讨论】:

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

标签: java string


【解决方案1】:

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

要查找所有索引,请查找第一次出现的字母,然后如果找到一个(indexOf 返回正值),请使用indexOf(int ch, int fromIndex) 方法从最后一个位置继续查找,直到找到所有索引(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--;
}

您也可以一次性完成,而无需将索引保存在列表中:

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--;
}

【讨论】:

    猜你喜欢
    • 2020-08-31
    • 1970-01-01
    • 2017-02-24
    • 2022-11-12
    • 2015-04-01
    • 2020-06-02
    • 1970-01-01
    • 2021-11-25
    相关资源
    最近更新 更多