虽然循环在Java

问题描述

无论他的输入是否为真,我的while循环都返回true。因此它使用dao中的id方法检查导演是否存在。一旦更改为false且id不存在,则while循环应结束。 id从1开始进行第一次迭代。 d F Name和d S Name的第一个ID为1。如果当前导演名称与正在创建的新导演不同,则应将ID递增1。如果它们不匹配,则应简单返回“真正”。如果是else选项,那 应该只将id再增加1并返回循环。这应该一直持续到第一个不存在的ID或找到重复的名称为止。

在我看来,如果if语句在第一个if语句中有条件,它并没有运行,而是直接跳到嵌套在第一个if语句中的if语句。我已经尝试过使用do ... while()遍历循环,仅当语句和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) && !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) && director.getDirectorSurname().equals(dSName)) {
                                return true;
                            }
                            else {
                                id++;
                            }
                    }
                }
            return false;
    }

解决方法

从逻辑上分析,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) && 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;
}
,

我会重写整个方法。如我的评论中所述,如果不存在ID = 1的导演,那么您就永远不会进入。以同样的方式,如果您的ID到x-1,则ID x不会与任何导演关联,并且从x + 1开始,您就拥有某些导演(即,如果ID并非全部重叠),则永远不会检查最后一个。 我想做的是:

  • 在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()) && director.getDirectorSurname().equals(d.getDirectorSurname())) {
              return true;
           } //closes if

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

此外,为什么不直接在SQL中进行检查,例如在dao中添加方法checkDirector(name,surname),如果找到具有名称和姓氏的导演,该方法将返回true?该查询非常简单。