For循环只检查最后一个值

时间:2017-12-06 16:00:20

标签: java list login

我觉得我错过了一些非常简单的东西,但我似乎无法为它找到很多帮助。所以我在mem SQL数据库中使用vaadin和h2设计登录。有一种方法可以从列表中的数据库中返回值。麻烦的是我遇到了下面这个方法的问题。它意味着遍历列表中的每个条目,如果找到匹配的用户名/密码,则返回true。如果没有返回错误.....

public boolean checkUserInDatabase(String username, String email) {
    boolean result = false;
    List<User> localArray = getUserList();

    System.out.println("List retrieved...Checking user in database"+ 
localArray);
    for (User u : localArray ) {
        if (u.getUsername().equals(username)) {
            result = true;
        }
        else {

            result = false;
        }
    }
    return result;
}

我知道此时我只检查用户名,但是当我将用户添加到数据库时,它仍然只会检查该数据库中的最后一个用户....想法?

6 个答案:

答案 0 :(得分:7)

您正在检查每个值,但是您从最后一个值中检索它。你基本上需要一个你已经拥有的退出条件。将您的代码更改为此

public boolean checkUserInDatabase(String username, String email) {
    List<User> localArray = getUserList();
    for (User u: localArray) {
        if (u.getUsername().equals(username)) {
            return true;
        }
    }
    return false;
}

答案 1 :(得分:3)

纯粹是合乎逻辑的。您正在遍历列表,只有在结尾返回值。因此,您的程序将遍历整个列表,并仅提供最后的结果。这是您完整,正确的计划:

public boolean checkUserInDatabase(String username, String email) {
    boolean result = false;
    List<User> localArray = getUserList();

    System.out.println("List retrieved...Checking user in database"+ localArray);
    for (User u : localArray ) {
        if (u.getUsername().equals(username)) {
        return true;
        }
    }

return result;
}

这样,如果你的程序找到了一个用户,它会直接回复true,而不是通过列表的其余部分。

答案 2 :(得分:2)

一旦找到用户,你肯定应该返回布尔值。

if (u.getUsername().equals(username)) {
  return true;
}

答案 3 :(得分:2)

您将浏览整个列表并每次重置返回值,因此最后一个是唯一重要的值。你需要这样的东西:

boolean userFound = false;
for (User u : localArray ) 
{
    if (u.getUsername().equals(username)) 
    {
        userFound = true;
        break;
    }
 }

return userFound ;

答案 4 :(得分:2)

你想在最后一行返回值的想法实际上是好的 - 它是single-point-of-return的原则,我建议这样做。它使调试更容易。所以解决方案就像:

public boolean checkUserInDatabase(String username, String email) {
    boolean result = false;
    List<User> localArray = getUserList();

    System.out.println("List retrieved...Checking user in database" + localArray);
    for (User u : localArray ) {
        if (u.getUsername().equals(username)) {
            result = true;
            break;
        }  else {
            result = false;
        }
    }
    return result;
}

虽然应该提到有不同的思想流派。我个人更喜欢单点回报,但两者都可以找到参数。

答案 5 :(得分:0)

Java 8解决方案将完全避免for循环并简单地说:

boolean userFound = collection.stream()
    .map(User::getUsername)
    .anyMatch(n -> n.equals(username))