2014-12-02 111 views
1

我已经创建了一个拥有由用户创建的“账户”的ArrayList。我现在正在尝试编写一个“登录”函数,它循环访问ArrayList,并根据帐户ArrayList中已有的帐户检查用户输入。这是我的循环;ArrayList的字符串比较

for(UserInfo createdUser : auctionAccounts){ 
    if(enteredUser.equals(createdUser.userName) && enteredPass.equals(createdUser.passWord)){ 
     System.out.println("Welcome: " +createdUser.userName); 
     returnToMenu();     
    }else{ 
     System.out.println("Username or Password is wrong!"); 
     loginAccount(aI);    
    } 
} 

如果在ArrayList中只有一个帐户,这种方法绝对没问题。但是,如果列表中有多个帐户,我只能登录到第一个帐户,而之后没有帐户。

我还试图使用ArrayList.contains()方法,而不是.equals(),然而,这产生相同的结果。

编辑:我想补充,我这是怎么创建帐户;

UserInfo createdUser = new UserInfo(); 

System.out.println("---- Enter a username ----"); 
createdUser.setUsername(scanner.next()); 

System.out.println("---- Enter a password ----"); 
createdUser.setPass(scanner.next()); 

this.aI.createAccount(createdUser); 
accountHandler(aI); 

回答

2

您应该做的第一件事是删除循环内部的else部分,以尝试匹配用户名和密码。

原因是,您不知道用户名/密码组合是否错误,直到您检查了整个列表

但是,如果用户输入的内容与列表中的第一位用户不匹配,则告诉用户他们输入了错误信息

实际上,每个用户尝试登录时,你必须确定他们是否输入正确的信息,因为你必须尝试将它们匹配到每个现有的用户之前通过你的整个列表进行迭代。

这里是你的代码可能看起来怎么样:

for(UserInfo createdUser : auctionAccounts){ 
    if(enteredUser.equals(createdUser.userName) && enteredPass.equals(createdUser.passWord)){ 
     System.out.println("Welcome: " +createdUser.userName); 
     returnToMenu();     
    } 
} 
// if this point is reached, then username and pw are invalid 
System.out.println("Username or Password is wrong!"); 

如果你不想在整个列表中的每个用户尝试登录(因为这可能是足够大的非常低效的时间迭代用户数量),您可以使用某种Map将用户名与正确的密码关联起来。这将允许你快速的查找表,消除重复对所有用户:

Map<String, UserInfo> auctionAccounts; 
// initialization, your other code ... 
if(auctionAccounts.get(enteredUser) != null &&      // user with entered username exists 
    auctionAccounts.get(enteredUser).password.equals(enteredPass) { // entered password is correct 
    // SUCCESSFULL LOGIN 
} else { 
    // INVALID USERNAME or PASSWORD 
}