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