0

这是我的源代码。我试图实现一个简单的程序,该程序向用户提出问题并期望答案为“是”或“否”,并且仅当用户回答“是”或“否”问题时才终止。这本书我建议我不要使用 == 比较,而是使用 equals 方法,这样程序就可以理解用户是否输入了“ye s”而不是“yes”。但是通过这种方式,结果是相同的,并且该方法似乎会比较用户的答案是否恰好是“是”或“否”。它不接受例如“n o”的回答。这种方法合乎逻辑吗?它应该这样工作吗?如何更改程序以接受“是”“是的”“否”“否”等答案。? 我会很感激你的帮助:)

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

}
4

4 回答 4

2

如果您使用==,您将比较两个 String 对象的引用(内存指针)。如果您使用,将运行该类equals中的自定义方法,该方法会进行一些“智能”比较,在这种情况下,检查字符是否都相同,并且整个事物具有相同的长度。String

如果您想支持混合大小写字母,您可以使用"someString".equalsIgnoreCase("SoMeString")(这将返回 true)。这是通过将两个字符串都设为小写(因此大小写无关紧要)并使用等号比较它们来完成的(粗略地说)。

编辑:其他海报让我意识到,除了大写之外,您还想寻找空格无关紧要的字符串相等。如果是这种情况,类似于将所有内容转换为小写的技巧适用,您首先删除所有空格,正如@LouisWasserman 在他的回答中所说

于 2012-07-05T16:14:32.150 回答
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();
}
于 2012-07-05T16:48:25.687 回答
0

==vs的语义.equals()

首先,您误解了语义。

==测试对象身份。A == B说是A对与 完全相同的对象的引用B

.equals()应用自定义逻辑来测试对象是否以某种逻辑方式相等,而不是完全相同的对象。为了正确实现这一点,两个对象也应该具有相同的.hashCode()值。

惯用的 Java 解决方案

由于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);
}

如果输入参数恰好是“yes”.equalsIgnoreCase() NullPointerException` ,将 aliteral与输入参数进行比较将使您免受影响。这是惯用的Java。NullPointerExceptionsnullcan never throw a

买一本更好的书

如果那本书真的说出了你所声称的内容,那本书就不是很有用。此外,它还教您编写大量代码来处理错误输入,因为这是一个完整的反模式,并且设计良好的程序会退出,并详细解释确切的问题是可以做些什么来修复输入。

于 2012-07-05T16:13:25.160 回答
-1

上面对 == 和 .equals 进行了很好的解释,这里有两个例子来说明你想要的比较。

if ( Pattern.matches("\\s*[yY]\\s*[eE]\\s*[sS]\\s*", input) ) {
  // do something
}


if ( input.replaceAll("\\s", "").equalsIgnoreCase("yes") ) {
  // do something
}
于 2012-07-05T16:58:49.987 回答