Как я могу выйти из оператора if? - PullRequest
0 голосов
/ 24 марта 2020

Цель моего кода - распечатать заголовок книги, если заголовок содержит заданный аргумент. Тесты предоставляются и проходят все тесты, за исключением этого заданного ввода: ожидаемый результат - «Гарри», однако реальный вывод, который я получаю, - «Нет совпадений для поискового запроса: Гарри». Итак, первое заявление, если оно не нарушает Гарри. Как я могу решить эту проблему, искал, где я делаю неправильно, но не мог найти это. Вот мой код:

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

Ответы [ 4 ]

3 голосов
/ 24 марта 2020

Ваш код проверяет только первую книгу , поскольку вы break из l oop в любом случае. Код для вывода «Нет попаданий» должен быть перемещен за пределы l oop, потому что вы не знаете, было ли попадание, до окончания полной итерации списка.

Чтобы узнать, есть ли книга было найдено, вам нужна переменная 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);
}

Вы также можете изменить l oop, чтобы выполнять только поиск, и печатать после l oop. На самом деле это хорошая стратегия, называемая Разделение проблем (То есть C).

// 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());
}
2 голосов
/ 24 марта 2020

Основная проблема заключается в том, что вы не проверяете все книги перед печатью сообщения об ошибке.

Попробуйте сделать следующее:

  • Вложите свой для l oop в блоке с меткой.
  • если книга найдена, напечатайте заголовок, вырвитесь из этого блока и не печатайте сообщение об ошибке.
  • В противном случае ошибка сообщение будет напечатано и завершится до конца метода.

Другой способ - просто вернуться, когда вы нашли книгу.

В любом случае вы:

  • Распечатайте название, когда книга найдена, и выйдите из метода.
  • Распечатайте метод ошибки после проверки всех книг.
    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);
     }
0 голосов
/ 24 марта 2020

Пересмотрите цель вашего оператора if

Ваше условие if решает, соответствует заголовок или нет. Если вы не соответствуете первой книге, вы, скорее всего, захотите продолжить поиск следующих книг. Так что не помещайте break внутри вашего оператора if , а вместо этого подсчитывайте или собирайте соответствующие книги внутри if.

Помните: Только одна условная ветвь вашего if -construction выполняется, либо , если последовательный блок , либо иначе последовательный блок .

Для прекращения при первом совпадении

Поставьте break; после if-оператор для ломки l oop только если найдено одно (или более, в соответствии с вашими требованиями) соответствие. Это остановит дальнейшую итерацию.

При умном перепроектировании вы можете даже использовать 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;
}

0 голосов
/ 24 марта 2020

Вам не нужно разбивать l oop в блоке else

...