Попытка запустить оператор Else внутри цикла For

#java #for-loop #if-statement

Вопрос:

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

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу просто поместить его в оператор Else внутри цикла For, потому что он будет выполняться каждый раз, когда код продукта не совпадает, пока не найдет соответствующий код, что заставит его работать несколько раз.

Любая помощь будет очень признательна, спасибо 🙂

 static void searchProduct() {
     
      System.out.print("Please enter product code to search: ");
      String searchTerm = in.nextLine().toUpperCase();
      
          for (int i = 0; i < report.size(); i  ) {

              if (report.get(i).code.equals(searchTerm)) { 

                  System.out.println("****************************************************************************"
                                     "nPRODUCT SEARCH RESULTS"
                                     "n****************************************************************************");

                  System.out.println("PRODUCT CODE >>         "   report.get(i).code); 

                  System.out.println("PRODUCT NAME >>         "   report.get(i).name);

                  System.out.println("PRODUCT CATERGORY >>    "   report.get(i).category);

                  System.out.println("PRODUCT WARRANTY >>     "   report.get(i).warranty);

                  System.out.println("PRODUCT PRICE >>        "   report.get(i).price);

                  System.out.println("PRODUCT LEVEL >>        "   report.get(i).stock);

                  System.out.println("PRODUCT SUPPLIER >>     "   report.get(i).supplier);

                  System.out.println("****************************************************************************");
              }
              
              else {
                  // System.out.println("The product cannot be located. Invalid Product");
              }    
          } 
      
      System.out.println("Enter (1) to launch menu or any other key to exit");
      String opt2 = in.nextLine();

          if (opt2.equals("1")) {

              mainMenu.Menu();

          }

          else { System.exit(0); }
  }
 

Комментарии:

1. поставьте break; там, где вы хотите остановить цикл, и выйдите из него.

Ответ №1:

Отделите печать от зацикливания:

Пролистайте список, пока не найдете нужный элемент:

 Report r = null;
for (int i = 0; i < report.size();   i) {
  if (report.get(i).code.equals(searchTerm)) { 
    r = report.get(i);
    break;
  }
}

// or
for (Report rep : report) {
  if (rep.code.equals(searchTerm)) {
    r = rep;
    break;
  }
}

// or
Report r = report.stream().filter(rep -> rep.code.equals(searchTerm)).findFirst().orElse(null);
 

Теперь r это ненулевое значение только в том случае, если вы что-то нашли, поэтому после цикла:

 if (r != null) {
  // Print stuff.
} else {
  // Print message saying you didn't find it.
}
 

Комментарии:

1. Большое спасибо за помощь! Удачного дня леккера.

2. @Брэд «леккер» ДО нового слова 🙂

Ответ №2:

Используйте логический флаг, чтобы определить, найден ли продукт:

 boolean found = false;
for (int i = 0; i < report.size(); i  ) {

              if (report.get(i).code.equals(searchTerm)) { 

                  System.out.println("****************************************************************************"
                                     "nPRODUCT SEARCH RESULTS"
                                     "n****************************************************************************");

                  System.out.println("PRODUCT CODE >>         "   report.get(i).code); 

                  System.out.println("PRODUCT NAME >>         "   report.get(i).name);

                  System.out.println("PRODUCT CATERGORY >>    "   report.get(i).category);

                  System.out.println("PRODUCT WARRANTY >>     "   report.get(i).warranty);

                  System.out.println("PRODUCT PRICE >>        "   report.get(i).price);

                  System.out.println("PRODUCT LEVEL >>        "   report.get(i).stock);

                  System.out.println("PRODUCT SUPPLIER >>     "   report.get(i).supplier);

                  System.out.println("****************************************************************************");
                  found= true;
              }
              
             
          } 
          //end of the loop
          if(!found) System.out.println("The product cannot be located. Invalid Product");
 

Комментарии:

1. Лучше использовать расширенный цикл for ( for (Report r : report) ).

2. Спасибо, это очень полезно знать!

Ответ №3:

Переключите структуру данных, используемую для поиска элементов в «отчете», из списка в хэш-карту, чтобы избежать необходимости перебирать их все:

 HashMap<String, Integer> quickSearchMapping;
quickSearchMapping = new HashMap<>(); 
for(int i=0 ; i<report.size ; i   ){
    quickSearchMapping.put(report.get(i).code, i);
}

while(TRUE){
    System.out.print("Please enter product code to search: ");
    String searchTerm = in.nextLine().toUpperCase();
    if quickSearchMapping.containsKey(searchTerm){
        Report the_report = report.get(quickSearchMapping.get(searchTerm));
        //print to user stuff in the_report
        break; //break if you wish to
    } else {
        System.out.println("Code entered didn't match any product.");
    }
}