【问题标题】:for each loop exit when result is found找到结果时为每个循环退出
【发布时间】:2018-07-06 15:12:16
【问题描述】:

我在下面有这段代码。假设我的列表中有 3 个用户。 用户号 1 用户编号 2 用户号 3 我想在控制台中传递用户名和密码,以便包含此循环的方法检查数据是否正确。 **我的问题是:**我想登录帐号 3,但控制台打印“错误”2 次,最后打印“确定”(我知道为什么,但是 - 它会检查列表中每个对象的这个条件,但我不能想出解决方案) 如何更改此代码,使其仅在登录/通过正确时写入“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");
                }
            }

【问题讨论】:

  • 将所有代码直接作为文本发布在这里。
  • 您每次尝试登录时都在遍历用户列表,我猜您会得到 2 次“错误”和“确定”,因为您使用的是 UserNo3 登录。使用 hashmap 而不是 List 来存储您的用户凭据。话虽如此,可能不是很安全。

标签: java arrays list loops


【解决方案1】:

好的,在 Java 8 中,您可以使用 Streams。过滤任何相同的用户和密码。返回一个布尔结果。

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 版本

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】:

    满足条件后添加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; 语句立即退出循环

    【讨论】:

    • 这仍然会打印两次“ERROR”,然后打印“OK”,然后在检查 UserNo3 时中断。
    • 当我尝试登录帐号 3 时,它仍然会写入 2 次“错误”。就像它仍然检查每个对象的条件,直到找到正确的对象:(
    • 试试这个。
    【解决方案3】:

    如果您希望它在登录不成功时只打印一次“ERROR”,您必须将打印语句移到循环之外。只要 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】:

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

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

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

      【讨论】:

        【解决方案5】:

        “ERROR”被打印多次,因为用户对象列表中的每个不匹配都会导致打印“ERROR”。这可以通过删除 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");
        

        【讨论】:

          猜你喜欢
          • 2023-03-08
          • 1970-01-01
          • 1970-01-01
          • 2010-12-18
          • 1970-01-01
          • 2021-07-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多