找到结果时为每个循环退出

时间:2018-07-06 15:12:17

标签: java arrays list loops

我在下面有此代码。假设我的列表中有3个用户。 userNo1 userNo2 userNo3 我想在控制台中传递用户名和密码,以便包含此循环的方法检查数据是否正确。 **我的问题是:**我想登录帐号3,但是控制台会打印2次“ ERROR”,然后打印“ OK”(我知道为什么,但是-它会检查列表中每个对象的状态,但是我无法提出解决方案) 如何更改此代码,以便仅在登录/通过正确时才写“ OK”,如果传递的数据错误则仅打印“ ERROR”一次?

CODE

            System.out.print("Login: ");
            String username = scanner.nextLine();
            System.out.print("Password: ");
            String password = scanner.nextLine();

            for(User checkedUser : userList) {
                if ((username.equals(checkedUser.getUsername())) &&
                        (password.equals(checkedUser.getPassword()))) {
                    System.out.println("OK");


                } else {
                    System.out.println("ERROR");
                }
            }

5 个答案:

答案 0 :(得分:0)

在满足条件后添加break;语句以退出循环。

喜欢

 boolean isAuthorized = false;
 for(User checkedUser : userList) {
     if ((username.equals(checkedUser.getUsername())) &&
         (password.equals(checkedUser.getPassword()))) {
             System.out.println("OK");
             isAuthorized = true;
             break;
     }
 }

 if(!isAuthorized){
     System.out.println("ERROR"); // auth failed
 }

break;语句立即退出循环

答案 1 :(得分:0)

好的,在Java 8中可以使用流。过滤所有等于用户名和密码的用户。返回布尔结果。

userList.stream()                       
                .filter(x -> username .equals(x.getUsername()) && password.equals(x.getPassword()))        
                .findAny().isPresent();

        if(exist)
        {
            System.out.println("OK");
        }else
        {
            System.out.println("ERROR");
        }

如果您使用的是Java版本<8,则对所有列表进行迭代(如果找到的话)将其破坏并返回true。否则,辅助变量将为false。

boolean exist = false;
        for(User checkedUser : userList) {
            if ((username.equals(checkedUser.getUsername())) &&
                    (password.equals(checkedUser.getPassword()))) {
                exist = true;
                break;
            } 
        }

        if(exist)
        {
            System.out.println("OK");
        }else
        {
            System.out.println("ERROR");
        }

答案 2 :(得分:0)

将用户名和密码作为键/值对存储在哈希图中。然后检查是否为map.containsKey(username),如果为true,则检查是否为password.equals(map.getValue(username)))

有效地,您可以在一行代码中完成以上操作

System.out.println(map.containsKey(username) && password.equals(map.getValue(username)) ? "OK" : "ERROR");

答案 3 :(得分:0)

如果您希望登录失败后仅打印一次“ ERROR”,则必须将print语句移出循环。只要print语句在循环内,您最终将获得多次打印。

为此,您还需要在循环之前声明一个变量,该变量将容纳在循环内进行的验证结果:

String result = "ERROR"
for(User checkedUser : userList) {
        if ((username.equals(checkedUser.getUsername())) &&
                (password.equals(checkedUser.getPassword()))) {
            result == "OK";
            break;
System.out.println(result);

答案 4 :(得分:0)

“错误”被多次打印,因为用户对象列表中的每个不匹配都会导致“错误”被打印。可以通过删除else语句并在循环外插入另一个if语句来避免这种情况:

        System.out.print("Login: ");
        String username = scanner.nextLine();
        System.out.print("Password: ");
        String password = scanner.nextLine();
        boolean status = false;

        for(User checkedUser : userList) {
            if ((username.equals(checkedUser.getUsername())) &&
                    (password.equals(checkedUser.getPassword()))) {
                System.out.println("OK");
                status = true;
            } 
        }

        if(status == false)
                  System.out.println("ERROR");