Циклы While всегда возвращают true в java

#java #spring #loops #while-loop

#java #spring #циклы #цикл while

Вопрос:

Мой цикл while возвращает true независимо от того, является ли его ввод true или нет. Таким образом, он проверяет, существует ли director, используя метод id в dao. Цикл while должен завершиться, как только это значение изменится на false, а идентификатор не существует. идентификатор начинается с 1 для первой итерации. Имя Df и имя ds принимают первый идентификатор, равный 1. Если текущие имена директоров не совпадают с именами создаваемого нового директора, он должен увеличить id на 1. Если они не совпадают, он должен просто вернуть «true». Если это параметр else, то это должно просто снова увеличить id на 1 и вернуться в цикл. Это должно продолжаться до тех пор, пока не будет найден первый идентификатор, который не существует, или дублирующее имя.

Мне кажется, что он не выполняет условный оператор if в самом первом операторе if и не переходит сразу к оператору if, вложенному внутри первого. Я пробовал перемещаться по циклу, используя do … while(), только операторы if и while без ifs и без изменений.

 This is the loop I am working on. 
   

public boolean checkDirectorNameIsNotDuplicate(Director director) {
        int id = 1;
        String dFName;
        String dSName;
            while(directorDao.existsById(id)==true) {
                dFName = directorDao.getDirectorFirstNameById(id);
                dSName = directorDao.getDirectorSurnameById(id);
                if (!director.getDirectorFirstName().equals(dFName) amp;amp; !director.getDirectorSurname().equals(dSName)){// if directorFirstName is not equal to dFName AND directorSurname is not equal to dsname
                        id  ; //move to next Id
                        System.out.println(id);
                        }
                else {
                            if (director.getDirectorFirstName().equals(dFName) amp;amp; director.getDirectorSurname().equals(dSName)) {
                                return true;
                            }
                            else {
                                id  ;
                            }
                    }
                }
            return false;
    }
  

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

1. Вам никогда не нужно указывать == true , а правильный отступ значительно облегчает чтение вашего кода.

2. если director с id=1 не существует, программа никогда не введет while. Таким же образом, когда нет директора с id = x, он завершится

3. С точки зрения реальности комбинация Имя / фамилия редко уникальна в любой организации любого размера. И имена очень личные. Когда я работал в Пенсильванском государственном университете, я бы подал жалобу на все, что требовало от меня ввода имени (я использую свой первый инициал, а также среднее и фамилий).

4. Спасибо. Я на самом деле учусь, поэтому у меня есть некоторые требования, которые мне нужно научиться выполнять, поэтому это именно так! Разделяемое имя, а затем проверка, работает ли оно, является одним из них!

Ответ №1:

Логически анализируя, что-то в ваших операторах if-else избыточно. Лучше удалить некоторые инструкции и перейти к следующему коду, который является простой модификацией вашего.

Кроме того, ваша переменная id не имеет конечного условия, что может привести к бесконечному циклу.

 public boolean checkDirectorNameIsNotDuplicate(Director director) {
    int id = 1;
    String dFName;
    String dSName;
    while(directorDao.existsById(id)) {
        dFName = directorDao.getDirectorFirstNameById(id);
        dSName = directorDao.getDirectorSurnameById(id);

        if (director.getDirectorFirstName().equals(dFName) amp;amp; director.getDirectorSurname().equals(dSName)) {
            return true;
        }
        else {
            id  ;
            System.out.println(id);
            
            // add condition here to void an infinite loop
            if (/*something to do with id*/) {
                break;
            }
        }
    }
    return false;
}
  

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

1. Это помогло разобраться! Мне просто пришлось изменить условие в моем контроллере, которое вызывало страницу, но это сработало. Спасибо!

Ответ №2:

Я бы переписал весь метод. Как написано в моем комментарии, если director с id = 1 не существует, ваш while никогда не вводится. Таким же образом, если у вас есть идентификаторы до x-1, идентификатор x не связан ни с одним директором, а начиная с x 1 у вас есть несколько директоров (т. Е. Если идентификаторы не все смежные), последний никогда не будет проверен. Что я хотел бы сделать, так это:

  • извлеките всех директоров из списка с помощью нового метода в directorDao, скажем directorDao.list()
  • выполните итерацию по списку.

Пример кода

 public boolean checkDirectorNameIsNotDuplicate(Director director) {
    int id = 1;
    String dFName;
    String dSName;
    List<Director> directors=directorDao.list(); //new method in directorDao
    if (directors!=null){
       for(Director d:directors){
           if (director.getDirectorFirstName().equals(d.getDirectorFirstName()) amp;amp; director.getDirectorSurname().equals(d.getDirectorSurname())) {
              return true;
           } //closes if

       }// closes for
    return false;
    } //end method
  

Более того, почему бы вам не выполнить проверку непосредственно в SQL, что-то вроде добавления в dao метода checkDirector(name, surname) , который возвращает true, если найден директор sa с именем и фамилией? Выполнить запрос очень просто.