所以我有这个方法显示任何包含匹配子字符串(不区分大小写)的名称,并将匹配的名称输出到JTextArea。它从已存储为数组的输入文件中搜索名称。但如果我想显示"没有找到结果"当用户输入文件中不存在的内容时,它会显示"未找到结果"对于一切,甚至是存在的名称。如果我拿
else
displayArea.append("\n No results found");
声明我的方法再次正常工作并显示正确的信息。那么如何让它显示"没有找到结果"没有导致我的if语句停止工作?
private void match(String targetSubstring)
{
displayArea.setText("");
displayArea.append("FIND RESULTS for: " + targetSubstring);
displayArea.append("\n");
displayArea.append("\n Name Best Decade");
displayArea.append("\n--------------- ---------------");
targetSubstring = targetSubstring.toUpperCase();
for (int i = 0; i < namesArray.length; i++) {
String theName = namesArray[i].getName();
if (theName.toUpperCase().contains(targetSubstring))
{
displayArea.append("\n" + namesArray[i].getName() + "\t" + namesArray[i].bestDecade());
}
else
displayArea.append("\n No results found");
}
}
答案 0 :(得分:6)
此代码存在逻辑错误。
需要重写为:
// flag to see if any matches are found
boolean foundSomething = false;
for (int i = 0; i < namesArray.length; i++) {
String theName = namesArray[i].getName();
if (theName.toUpperCase().contains(targetSubstring))
{
displayArea.append("\n" + namesArray[i].getName() + "\t" + namesArray[i].bestDecade());
foundSomething = true;
}
}
// Now, if you didn't find anything, then add this
if (!foundSomething) {
displayArea.append("\n No results found");
}
<强>原因强>: 在for循环中使用else case将附加&#34;未找到结果&#34;任何时候namesArray中的单个索引都找不到匹配。
答案 1 :(得分:1)
问题是:namesArray
真的包含targetSubstring
吗?在我看来,你应该从提取开始
if (theName.toUpperCase().contains(targetSubstring))
{
displayArea.append("\n" + namesArray[i].getName() + "\t" + namesArray[i].bestDecade());
}
else
displayArea.append("\n No results found");
对于新方法并编写一些简单的测试 - 这个条件是否正确?
如果测试说条件没问题,那么你应该调试这部分代码,看看namesArray
中的数据有什么问题。因为此时代码看起来很好。
答案 2 :(得分:1)
问题在于,您正在打印&#34;未找到任何结果&#34;对于数组中的每个元素与子字符串不匹配。例如,如果第五个元素匹配,但不匹配前四个元素,则将打印&#34;未找到结果&#34;对于这四个要素中的每一个最好添加一个布尔值,告诉你是否找到了某个元素。循环之后,检查此布尔值是否告诉您没有找到匹配的元素。在这种情况下,告诉用户。
BTW:使用调试器很难找到。