这是我的源代码。我试图实现一个向用户提出问题并希望答案为“是”或“否”的简单程序,并且只有当用户回答“是”或“否”时才终止。我建议我不要使用==比较并使用equals方法,以便程序可以理解用户是否键入“y e s”而不是“yes”。但是以这种方式结果是相同的,并且该方法似乎比较用户的答案,如果它恰好是“是”或“否”。它不接受例如“n o”的aswer。那种方法合乎逻辑吗?它应该以这种方式工作吗?如何更改程序以接受“是”“你是”“否”“否”等答案?非常感谢你的帮助:)。
import acm.program.*;
public class YesNoExample extends ConsoleProgram{
public void run(){
while(true){
String answer = readLine("Would you like instructions? ");
if(askYesNoQuestion(answer)){
break;
}
println("Please answer yes or no.");
}
}
private boolean askYesNoQuestion(String str){
if(str.equals("yes")||str.equals("no")){
return true;
}else{
return false;
}
}
}
答案 0 :(得分:2)
如果使用==
,您将比较两个String对象的引用(内存指针)。如果您使用equals
,将运行String
类中的自定义方法,进行一些“智能”比较,在这种情况下,检查字符是否完全相同,并且整个事情都有相同的长度。
如果您想支持大小写混合字母,可以使用"someString".equalsIgnoreCase("SoMeString")
(将返回true)。通过使两个字符串小写(所以情况无关紧要)并使用equals进行比较来完成(粗略地说)。
编辑:其他海报让我意识到,除了大写之外,你还想在空格无关紧要的情况下寻找字符串相等。如果是这种情况,将一切变为小写的类似技巧适用,首先删除所有空格,如@LouisWasserman在其答案中所述
答案 1 :(得分:1)
如果您需要模糊识别是/否,首先您需要确切的规则来确定匹配。根据您的示例,我可以建议:
private boolean askYesNoQuestion(String str) {
str = str.replace(" ", "").toUpperCase();
return str.equals("YES") || str.equals("NO");
}
如果对最佳表现感兴趣而且对可懂度感兴趣,请使用:
private static final Pattern p =
Pattern.compile("y\\s*e\\s*s|n\\s*o", Pattern.CASE_INSENSITIVE);
private boolean askYesNoQuestion(String str) {
return p != null && p.matcher(str.trim()).matches();
}
答案 2 :(得分:0)
==
vs .equals()
首先,你误解了语义。
==
测试对象标识。 A == B
表示A
是与B
完全相同的对象的引用。
.equals()
应用自定义逻辑来测试对象是否以某种逻辑方式相等,而不是完全相同的对象。为了使其正确实现,两个对象也应具有相同的.hashCode()
值。
由于String
对象是final
,这意味着它无法继承。您无法覆盖.equals()
对象上的String
。
您需要做的是将输入预处理为可以使用.equalsIgnoreCase()
直接与目标值进行比较的内容。
执行此操作的一种方法是使用answer.replaceAll("\\s","")
删除所有空格,然后将其与目标String
文字与.equalsIgnoreCase()
进行比较。
替换askYesNoQuestion()
的更好方法是:
private boolean isAnswerYesOrNo(final String answer)
{
final String input = answer.replaceAll("\\s","");
return "yes".equalsIgnoreCase(input) || "no".equalsIgnoreCase(input);
}
如果输入参数恰好为literal
“是”,则将NullPointerExceptions
与输入参数进行比较将使您与null
绝缘.equalsIgnoreCase()can never throw a
NullPointerException`。这是惯用的Java。
如果这本书真的说出了你声称它的内容,那本书就不是很有用了。此外,它教你编写大量代码来处理错误的输入,当这是一个完整的反模式和一个精心设计的程序将退出时,对确切问题的详细解释是可以做什么来修复输入。
答案 3 :(得分:-1)
通过上面详细描述的==和.equals的解释,这里有一个两个例子,可以进行你想要的比较。
if ( Pattern.matches("\\s*[yY]\\s*[eE]\\s*[sS]\\s*", input) ) {
// do something
}
if ( input.replaceAll("\\s", "").equalsIgnoreCase("yes") ) {
// do something
}