在Java中停止ArrayList的迭代

时间:2011-06-09 12:02:17

标签: java arraylist iteration

我正在迭代名为 clientList ArrayList个客户端,其中包含来自班级Client (user,pass)

的客户端
ArrayList<Client> clientList= new ArrayList<Client>();

这是迭代。我想停止迭代,如果它找到一个给定的用户(用户),如果密码(通过)匹配:

            for (Client c : clientList) {
                userA = c.getUser();
                if (userA.equals(user)) {
                    passA = c.getPassword();
                    if (passA.equals(pass)) {
                        loginOK = true;
                        found= true;
                    }

我正在尝试以下 while(found == false)但是如果它没有在ArrayList上找到用户就会被卡住:

        while (found == false) { /
            for (Client c : clientList) {
                userA = c.getUser();
                if (userA.equals(user)) {
                    passA = c.getPassword();
                    if (passA.equals(pass)) {
                        loginOK = true;
                        found= true;
                    }
                }
            }
        }

7 个答案:

答案 0 :(得分:8)

找到值时,您应该break离开循环。

for (something) {
   if (anotherThingIsFound) {
      break;
   }
}
//Execution will continue here when you break...

请注意,借助标签,也可以打破嵌套循环。 E.g。

outer:
while (someCondition) {
   for (criteria) {
      if (somethingHappened) {
         break outer; 
      }
      if (anotherThingHashHappened) {
         break;
      }
   }
   //Execution will continue here if we execute the "normal" break.
}
//Execution will continue here when we execute "break outer;"

continue也适用于标签。

答案 1 :(得分:5)

为什么不只是break

for (Client c : clientList) {
    userA = c.getUser();
    if (userA.equals(user)) {
        passA = c.getPassword();
        if (passA.equals(pass)) {
            loginOK = true;
            found = true;
            break;
        }
    }
}

(我假设您需要区分到达终点和找到某人并且到达终点而找到某人。您可能只需要虽然有一个变量,而不是两个......)

使用while循环尝试,如果找不到用户,您将永远遍历整个列表,即使找到用户 ,它也会循环整个列表一次 - 因为你的for循环是里面 while循环。 while循环条件仅在每次迭代 of while循环时检查一次。

答案 2 :(得分:3)

您需要使用break关键字:

        for (Client c : clientList) {
            userA = c.getUser();
            if (userA.equals(user)) {
                passA = c.getPassword();
                if (passA.equals(pass)) {
                    loginOK = true;
                    found = true;
                    break;
                }

请参阅Java break keyword documentation

答案 3 :(得分:2)

如果您想使用found属性,请引入break并删除while循环:

for (Cliente c : clientList) {
    userA = c.getUser();
    if (userA.equals(user)) {
        passA = c.getPassword();
        if (passA.equals(pass)) {
        loginOK = true;
        found= true;
        }
    }

    if (found)
        break;
}

这样,您不需要使用while循环:

答案 4 :(得分:1)

我会这样写:

while (!found) { 
    for (Cliente c : clientList) {
        userA = c.getUser();
        if (userA.equals(user)) {
            passA = c.getPassword();
            if (passA.equals(pass)) {
                loginOK = true;
                found= true;
                break;
            }
        }
    }
}

我的猜测是你没有覆盖Cliente类中的equals和hashCode,或者它不正确。

答案 5 :(得分:1)

为简单起见,省略了无效安全和分级安全

public class Cliente {
    public boolean equals(Object other){
         Cliente cOther = (Cliente) other;
         return this.getUser().equals(other.getUser()) &&
                this.getPassword().equals(other.getPassword())
    }
    public int hashCode(){
        return this.getUser().hashCode()*this.getPassword().hashCode();
    }
}

...
Cliente c = new Cliente();
c.setPassword(pass);
c.setUser(user);
boolean found = clientList.contains(c);

答案 6 :(得分:1)

使用break工作正常,但是如果你想用while循环来做,那么你可以这样做:

    Iterator<Client> it = clientList.iterator();
    while (it.hasNext() && !found) {
        Client c = it.next();
        userA = c.getUser();
        if (userA.equals(user)) {
            passA = c.getPassword();
            if (passA.equals(pass)) {
                loginOK = true;
                found = true;
            }
        }
    }