Остановка итерации ArrayList в Java - PullRequest
0 голосов
/ 09 июня 2011

Я итерирую ArrayList клиентов с именем clientList , которые содержат клиентов из класса 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 ]

8 голосов
/ 09 июня 2011

Вы должны break выйти из цикла, когда будет найдено значение.

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

Обратите внимание, что также возможно вырваться из вложенных циклов с помощью меток.Например,

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 также работает с метками.

5 голосов
/ 09 июня 2011

Почему бы не просто 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 проверяется только один раз за итерацию цикла while .

3 голосов
/ 09 июня 2011

Вам необходимо использовать ключевое слово 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 .

2 голосов
/ 09 июня 2011

, если вы хотите использовать свой атрибут 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:

1 голос
/ 09 июня 2011

Использование 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;
            }
        }
    }
1 голос
/ 09 июня 2011

Пропущена нулевая безопасность и классовая безопасность для простоты

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);
1 голос
/ 09 июня 2011

Я бы написал так:

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;
            }
        }
    }
}

Я предполагаю, что вы не переопределяете equals и hashCode в своем классе Cliente, или это не правильно.

...