我创建了ArrayList
个用户。我已经提出了添加新用户的方法。用户必须拥有电子邮件,并且程序必须检查ArrayList
以查看用户是否已存在于ArrayList
中。如果我分别运行检查正确的电子邮件和正确的名称,它可以工作,但是当我使用此while(userExists || matchFound)
组合它时,它不起作用。我已经尝试了一切,所以希望你能帮助我。提前谢谢。
public void addUser()
{
System.out.println("-----------------------------"); //separation of previous screen
System.out.println("Create a new user.");
boolean userExists = false;
boolean matchFound = false;
String userToAdd;
do {
System.out.println("Username: ");
userToAdd = input.next();
Pattern p = Pattern.compile(".+@.+\\.[a-z]+");
Matcher m = p.matcher(userToAdd);
matchFound = m.matches();
if (matchFound) {
System.out.println("just a check if it is a email");
}
if(!matchFound) {
System.out.println("no email. Try again.");
matchFound = true;
}
for(User currentUser : db.getUsers()) {
if (currentUser.getName().equals(userToAdd)) {
System.out.println("User already exist. Try again.");
userExists = true;
}
}
} while(userExists || matchFound);
}
答案 0 :(得分:1)
只要用户不是有效的电子邮件或它已经存在,您就想留在循环中。因此,您需要:
while(userExists || !matchFound);
如果匹配错误,你可能不应该将matchFound设置为true:
if(!matchFound){
System.out.println("no email. Try again.");
matchFound = true; // remove this line
}
只应由matchFound = m.matches();
答案 1 :(得分:0)
我认为您需要保留,除非用户名不存在并且具有有效的电子邮件ID。您应该执行以下操作:
while(!userExists || !matchFound);
有了这个,你将循环,直到除非你同时拥有两个有效数据。
答案 2 :(得分:0)
我认为如果你的命名正确,你的代码会更好。 " matchFound"并没有真正说明,我想这就是混乱的来源。这就是为什么我建议你使用" isEmail"代替。这使代码更具可读性。另一个问题是您在循环内部使用仅在循环外部初始化一次的变量。这适用于循环的第一次迭代,但第二次导致不确定的行为。例如,如果您要输入系统中已有的电子邮件,userExists
将设置为true,并且对于循环的连续迭代保持为真。
我还删除了电子邮件有效的情况下的输出。如果您只是在出现错误的情况下出现错误,那么用户体验会更好。在输入有效用户名后,您肯定会向用户提供更多功能。这将是足够的反馈,以便用户了解操作是否成功。
这应该有效:
public void addUser()
{
System.out.println("-----------------------------"); //separation of previous screen
System.out.println("Create a new user.");
boolean userExists = false;
boolean isEmail = false;
do
{
userExists = false;
isEmail = false;
System.out.print("Username: ");
String userToAdd = input.next();
Pattern p = Pattern.compile(".+@.+\\.[a-z]+");
Matcher m = p.matcher(userToAdd);
isEmail = m.matches();
if (!isEmail)
{
System.out.println("Not an email. Try again.");
}
for(User currentUser : db.getUsers())
{
if (currentUser.getName().equals(userToAdd))
{
System.out.println("User already exist. Try again.");
userExists = true;
break;
}
}
}while(userExists || !isEmail);
}
答案 3 :(得分:0)
如果错误,则不应将matchfound
设置为false。在下一个循环中,默认情况下是正确的。并且你没有在第一个区块中将其更改为false。
然后您应该使用!matchfound
代替匹配找到。所以当你没找到匹配时,你会再次循环
答案 4 :(得分:0)
您可能希望将布尔值重新初始化为false
作为do循环中的第一个语句。否则,如果为userExists
分配true
进行迭代,则对于所有连续迭代,它将保持true
。
do
{
userExists = false;
matchFound = false;
System.out.println("Username: ");
userToAdd = input.next();
}