Java新手和我坚持看似非常简单的事情。我为我正在构建的游戏编写了一个算法,并且使用TDD,我的所有测试都通过了,但实际游戏没有返回正确的反馈。相反,每当我猜一个正确的字母,它就会返回一个" w"并且应该返回" b"。
背景 游戏通过生成4个字符的随机代码开始。游戏的目的是输入猜测并尝试匹配密码。反馈类应该告诉我,与代码相比,我的猜测是热还是冷。
我将猜测和密码传递给班级并计算反馈。猜测是我使用的字符串" split"变成一个String数组。密码也是一个字符串数组,我随机生成4个不同的字符串值。我试着检查猜测和密码中的一个元素是否是字符串并得到" true"双方。
问题 问题是我的确切匹配if语句永远不会被执行。我读过你应该使用equals()而不是尝试但是会出错。
有人可以帮忙吗?
这是我的反馈课程: 公共课反馈{
public String[] guess;
public String[] secretCode;
public String[] feedback;
public String[] get(String[] guess, String[] secretCode) {
this.guess = Arrays.copyOf(guess, guess.length);
this.secretCode = Arrays.copyOf(secretCode, secretCode.length);
feedback = new String[this.secretCode.length];
findExactMatches();
findNearMatches();
findNoMatches();
sortFeedback();
return feedback;
}
public void findExactMatches() {
for (int i = 0; i < guess.length; i++) {
if (guess[i] == secretCode[i]) {
feedback[i] = "b";
guess[i] = "x";
secretCode[i] = "x";
}
}
}
public void findNearMatches() {
for (int i = 0; i < guess.length; i++) {
if ( Arrays.asList(secretCode).contains(guess[i]) && guess[i] != "x" ) {
feedback[i] = "w";
int matched_symbol_index = Arrays.asList(secretCode).indexOf(guess[i]);
secretCode[matched_symbol_index] = "x";
}
}
}
public void findNoMatches() {
for (int i = 0; i < guess.length; i++) {
if ( feedback[i] == null ) {
feedback[i] = " ";
}
}
}
public void sortFeedback() {
Arrays.sort(feedback);
}
}
答案 0 :(得分:3)
比较String
时,请使用equals
代替==
。 String.equals
会对内容进行比较,而==
会比较身份(即如果它们是同一个对象)。
所以,
guess[i] == secretCode[i]
应该是
guess[i].equals(secretCode[i])
如果您想了解更多信息,那么如果 interned 字符串,您可以==
。但这完全是奖励内容。
编辑:还有,正如johnchen902在评论中所说:
猜猜[i]!=“x”应该是!猜[i] .equals(“x”)。 (在findNearMatches()中)
答案 1 :(得分:3)
这些是strings
所以你应该使用equals
,即guess[i].equals(secretCode[i])
guess[i] == secretCode[i]
将比较您不想要的两个字符串(“operator compares the objects’ location(s) in memory"
)的引用。
同样适用于guess[i] != "x"
,因此您将使用! guess[i].equals("x")
答案 2 :(得分:3)
将guess[i] == secretCode[i]
替换为guess[i].equals(secretCode[i])
,将guess[i] != "x"
替换为!guess[i].equals("x")
。
==
测试参考相等性。
.equals()
测试价值平等。
您可以找到更多信息here
public String[] guess;
public String[] secretCode;
public String[] feedback;
public String[] get(String[] guess, String[] secretCode) {
this.guess = Arrays.copyOf(guess, guess.length);
this.secretCode = Arrays.copyOf(secretCode, secretCode.length);
feedback = new String[this.secretCode.length];
findExactMatches();
findNearMatches();
findNoMatches();
sortFeedback();
return feedback;
}
public void findExactMatches() {
for (int i = 0; i < guess.length; i++) {
if (guess[i].equals(secretCode[i]) ) {
feedback[i] = "b";
guess[i] = "x";
secretCode[i] = "x";
}
}
}
public void findNearMatches() {
for (int i = 0; i < guess.length; i++) {
if ( Arrays.asList(secretCode).contains(guess[i]) && !guess[i].equals("x") ) {
feedback[i] = "w";
int matched_symbol_index = Arrays.asList(secretCode).indexOf(guess[i]);
secretCode[matched_symbol_index] = "x";
}
}
}