尝试使搜索功能(for-each)在找不到匹配项时打印出错误消息

Trying to make a search-function (for-each) print out an error message when no matches is found

我是 Java 的新手,总是犯一些小错误。我确定这只是另一个,但我真的很难理解这个概念。这就是我的代码现在的样子。

public void lstMatching(String searchString)
{
    for(String filename : files) {
        if(filename.contains(searchString)) {
            System.out.println(filename);
        }
        else{
            boolean invalid = true;
        }
    }
    if(invalid){
            System.out.println("Your search did not match any results.");
    }
}

我想做的是获取在 searchString 不匹配任何单个文件名时打印出我的错误消息的方法。为什么我不断收到一条错误消息,说我的 "invalid"-变量有误?

您需要在循环之前声明您的 invalid 变量。另外,您似乎已经颠倒了逻辑。您只需要满足一个匹配项,因此您应该在找到匹配项时更新变量:

public void lstMatching(String searchString)
{
    boolean invalid = true;
    for(String filename : files) {
        if(filename.contains(searchString)) {
            System.out.println(filename);
            invalid = false;
        }
    }
    if (invalid){
            System.out.println("Your search did not match any results.");
    }
}

注意以下几点:

  • invalid 仅在 else 范围内已知,因此当您尝试在 if 语句中使用它时 - 它在 [=12] 之外=] 范围,未知。详见The Java™ Tutorials - Variables

  • 您可以简化您的代码:

    public void lstMatching(String searchString)
    {
        boolean valid = false;
        for (String filename : files) {
            if (!filename.contains(searchString)) {
                // if logic here
            } else {
                // print
            }
        }
    }
    

"invalid"变量在else部分声明。 如果找到该文件,则不会声明 "invalid" 变量,因为它不会进入 else 部分)。而您正在尝试使用该变量来检查是否找到了文件。

public void lstMatching(String searchString)
{
    boolean invalid = false;

    for(String filename : files) {
        if(filename.contains(searchString)) {
            System.out.println(filename);
        }
        else{
            invalid = true;
        }
    }
    if(invalid){
            System.out.println("Your search did not match any results.");
    }
}

如果你使用 JDK8,只需要几行代码就可以做到:

public void lstMatching(String searchString) {
        if (Arrays.asList(files).stream().anyMatch(s -> s.contains(searchString))) {
            System.out.println("Your search matched");
        } else {
            System.out.println("Your search did not match any results.");
        }
    }

你面临的第一个问题是因为 else 块,因为 for 循环将检查所有文件,如果你的文件在文件名之间,它仍然会 return true(因为 inValid 变量值将始终依赖于最后一个文件的名称,如果姓氏不匹配,则 inValid 将为真,否则为假)。

在 for 循环之前声明 inValid 变量并用值 true 初始化它,如果找到文件名则在 for 循环中将 inValid 变量更改为 true 并中断,因为您不需要检查进一步。

public void lstMatching(String searchString)
{
    boolean invalid = true;
    for(String filename : files) {
        if(filename.contains(searchString)) {
            System.out.println(filename);
            invalid = false;
            break;
        }
    }
    if (invalid){
            System.out.println("Your search did not match any results.");
    }
}

如果您发现任何困难,请在下方评论告诉我。