【问题标题】:How can I break out of the if statement?如何摆脱 if 语句?
【发布时间】:2020-07-05 07:15:12
【问题描述】:

如果书名包含给定的参数,我的代码的目标是打印出书名。 提供了测试,并通过了除此给定输入之外的所有测试: 预期的输出是“Harry”,但我得到的实际输出是“No hits found for search term: Harry”。所以第一个 if 语句对 Harry 来说并没有破坏。我该如何解决这个问题,一直在寻找我做错的地方但找不到它。 这是我的代码:

 public void execute(LibraryData data) {
        for (BookEntry book : data.getBookData()) {
            if (book.getTitle().toLowerCase().contains(givenArgument.toLowerCase())) {
                System.out.println(book.getTitle());
                break;
            } else {
                System.out.println("No hits found for search term: " + givenArgument);
                break;
            }
        }

【问题讨论】:

  • 你的 if 语句可能是错误的,这就是为什么它没有打破 if,它永远不会进入它。
  • 你只看第一本书。
  • “break”语句跳出循环(for、while),但在“if”中不起作用,请参阅:stackoverflow.com/a/28816407

标签: java if-statement break


【解决方案1】:

您不必在 else 块中中断循环

【讨论】:

    【解决方案2】:

    您的代码只检查第一本书,因为无论哪种情况,您break 都退出了循环。打印“No hits”的代码必须移到循环之外,因为直到列表的完整迭代之后你才知道是否有命中。

    要知道是否找到了一本书,您需要一个 boolean 变量来记住这一点。

    boolean found = false;
    for (BookEntry book : data.getBookData()) {
        if (book.getTitle().toLowerCase().contains(givenArgument.toLowerCase())) {
            System.out.println(book.getTitle());
            found = true;
            break;
        }
    }
    if (! found) {
        System.out.println("No hits found for search term: " + givenArgument);
    }
    

    您还可以将循环更改为仅进行搜索,并在循环后打印。这实际上是一个很好的策略,称为Separation of Concerns (SoC)。

    // Search for book
    BookEntry foundBook = null;
    for (BookEntry book : data.getBookData()) {
        if (book.getTitle().toLowerCase().contains(givenArgument.toLowerCase())) {
            foundBook = book;
            break;
        }
    }
    
    // Print search result
    if (foundBook == null) {
        System.out.println("No hits found for search term: " + givenArgument);
    } else {
        System.out.println(foundBook.getTitle());
    }
    

    【讨论】:

    • 要扩展您的 SOC,使用单独的方法 List<Book> findBooksContaining(String titlePart) 将允许多次出现例如“哈利”。
    【解决方案3】:

    主要问题是您在打印错误消息之前没有检查所有书籍。

    试试这个:

    • 用标签将你的 for 循环括在一个块中。
    • 如果找到这本书,打印标题,跳出那个块,不要 打印错误消息。
    • 否则,错误消息将被打印出来并一直持续到方法结束。

    另一种方法是在找到这本书后直接返回。

    无论哪种方式都可以确保您:

    • 找到书时打印标题并退出该方法。
    • 检查所有书籍后打印错误方法。
        public void execute(LibraryData data) {
          outer:
          {
            for (BookEntry book : data.getBookData()) {
                if (book.getTitle().toLowerCase().contains(givenArgument.toLowerCase())) {
                    System.out.println(book.getTitle());
                    break outer;
                }
            }
            System.out.println("No hits found for search term: " + givenArgument);
          }
        }
    

    你也可以在找到书后直接返回。

        public void execute(LibraryData data) {
            for (BookEntry book : data.getBookData()) {
                if (book.getTitle().toLowerCase().contains(givenArgument.toLowerCase())) {
                    System.out.println(book.getTitle());
                    return;
                }
            }
            System.out.println("No hits found for search term: " + givenArgument);
         }
    

    【讨论】:

    • 必须有严格的限制才能支持带有break标记块(此处为outer)的设计,而不是在找到后应用短路return(在为了退出方法!)?
    • 只是展示了避免使用布尔值的方法。这两种方法都没有真正受到青睐。第二种方法显然是最好的。
    【解决方案4】:

    重新考虑 if 语句的用途

    你的 if 条件决定了标题是否匹配。 如果第一本书不匹配,您很可能希望继续探索后续书籍。 所以不要将break 放在你的 if 语句中,而是在 if 中计算或收集匹配的书籍。

    记住: 只执行 if 构造的一个条件分支,if consequential blockelse consequential block

    在第一场比赛中停赛

    break; 放在你的 if 语句之后以打破循环 仅当找到一个(或多个,根据您的要求)匹配时。 这将停止进一步的迭代。

    通过巧妙的重新设计,您甚至可以为此使用 return

    public boolean containsInTitle(LibraryData data, String givenArgument) {
       for (BookEntry book : data.getBookData()) {
          if (book.getTitle().toLowerCase().contains(givenArgument.toLowerCase())) {
            System.out.println("Found matching book:" +book.getTitle());
            return true; // replacement for break to exit on first match
           } else {
             System.out.println("Book does not contain term '" + givenArgument + "': " + book.getTitle());
           }
       }
      // if no book matches: default exit is
      return false;
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      • 2021-12-02
      相关资源
      最近更新 更多