public void reveal(char c) {
for(int i = 0; i < sizeReset; i++) {
if(wordCompare.charAt(i) == c) revealed.set(i);
if(revealed.cardinality() == 0) {
eo.add(String.valueOf('*'));
}
else {
if(revealed.get(i) == true) {
eo.add(String.valueOf(wordCompare.charAt(i)));
}
else {
eo.add(String.valueOf('*'));
}
}
}
System.out.println(eo.toString());
jTextPane1.setText(eo.toString().replace("[", "").replace("]", "").replace(",", ""));
}
注意:
String wordCompare - 包含要猜测的单词。
char c - 是用户输入的字母
透露 - 声明为BitSet
int sizeReset - 是要猜的单词的大小
确定ArrayList eo = new ArrayList();在方法之外声明。 (全局)
=============================================
这是我到目前为止所拥有的。假设我会猜测“香蕉”。将显示用户输入的字母,其余字母将标记为“*”。
===========================================
问题:它将包括“”在内的整个值附加到arrayList中存储值的末尾,而不是在我希望它们的特定位置。(还有“”应该附加时不包括在内,只包括用户输入的字母。 *悬挂游戏的逻辑。
示例:
输入第一个字母:“a”
输出:
_a_a_a
输入第二个字母:“n”
输出:
_ _n_n _
(这是错误的)
正确的输出应为:
_anana
===============================================
我是String操作的新手,我在使用这部分时遇到了麻烦。我已经阅读了一些关于StringBuilder的内容,但我还没有想到它。如果你可以帮助我真的很棒。提前致谢。 :)
答案 0 :(得分:1)
问题是您在reveal方法中存储包含替换字符的ArrayList。这意味着每次输入字符时都会创建新的ArrayList。要解决此问题,您必须将revealList存储在reveal方法之外,如下所示:
package xyz;
public class Name{
public ArrayList<String> eo = new ArrayList<String>();
public void reveal(char c){
// Reveal Code here
}
}
答案 1 :(得分:1)
你是对的,可以使用StringBuilder
来完成。您只需要将原始char
中包含String
的索引的char
替换为char
,这可以使用setCharAt
来完成。
以下代码也保持空格字符相同,这就是在构造函数中对空格进行特殊处理的原因。
import java.text.MessageFormat;
public class StringReveal {
private final String original;
private final StringBuilder stringBuilder;
private String currentString;
private int missingLetters;
public StringReveal(String original, char placeholder) {
if (original.indexOf(placeholder) >= 0) {
throw new IllegalArgumentException("placeholder must not be contained in the string");
}
if (Character.isWhitespace(placeholder)) {
throw new IllegalArgumentException("placeholder must not be a whitespace character");
}
this.original = original;
this.stringBuilder = new StringBuilder();
this.missingLetters = original.length();
for (char c : original.toCharArray()) {
if (Character.isWhitespace(c)) {
// keep whitespace characters the same
missingLetters--;
stringBuilder.append(c);
} else {
// replace everything else with placeholder char
stringBuilder.append(placeholder);
}
}
this.currentString = stringBuilder.toString();
}
public void reveal(char c) {
int index = original.indexOf(c);
if (index < 0 || currentString.charAt(index) == c) {
// if letter was already replaced or does not exist in the original
// there's nothing to do
return;
}
do {
// replace char
stringBuilder.setCharAt(index, c);
missingLetters--;
// find next char
index = original.indexOf(c, index + 1);
} while (index >= 0);
currentString = stringBuilder.toString();
}
public String getCurrentString() {
return currentString;
}
public int getMissingLetters() {
return missingLetters;
}
public static void main(String[] args) {
StringReveal stringReveal = new StringReveal("banana bread", '*');
char[] guesses = {'a', 'x', 't', 'a', 'b', 'k', 'n', 'g', 'd', ' ', '*', 'r', 'w', 'e'};
System.out.println("Try to guess this sting: " + stringReveal.getCurrentString());
for (char guess : guesses) {
stringReveal.reveal(guess);
System.out.println(MessageFormat.format("Current String: {0} ; guess: ''{1}''; you still have to guess {2} letters",
stringReveal.getCurrentString(),
guess,
stringReveal.getMissingLetters()));
}
}
}