我正在拍摄的是能够从我的GUI文本字段输入,并将其放入数组列表。然后我需要检查数组,看看数组中是否已经有Integer了。如果是这样,我需要删除这两个整数,使整数不再是在数组内。我还需要能够添加整数,如果它不是一个重复的数组列表。
这样做的目的是能够让用户用一个数字登录。我的愿景是让他们在登录或注销时输入自己的唯一号码(就像计时器一样)。如果他们的号码不在数组中,他们正在登录。如果他们的号码在数组列表中,那么他们就退出了。
这是我的代码到目前为止,我得到了一个问题与签署。它继续将数组中的第二个值作为唯一能够登出的值发送回来。我试过修理它,但似乎不知道出了什么问题。让我知道,如果它会更有帮助,如果我张贴我的整个程序,或者如果这个代码片段是足以弄清楚。
谢谢,
private void btnSignInActionPerformed(java.awt.event.ActionEvent evt) {
// Get data from form and put it into an Array List
Integer txtUserSignInName = Integer.valueOf(txtUserSignIn.getText());
ArrayList<Integer> userSignInNumber = new ArrayList();
userSignInNumber.add(12345678); //sample data
userSignInNumber.add(55489563); //sample data
userSignInNumber.add(26489564); //sample data
userSignInNumber.add(78654865); //sample data
userSignInNumber.add(txtUserSignInName);
// Setting up HashSet so no duplicate data
Set<Integer> hashSet = new HashSet<>();
hashSet.addAll(userSignInNumber);
userSignInNumber.clear();
userSignInNumber.addAll(hashSet);
// Other settings needed
SimpleDateFormat df = new SimpleDateFormat("hh:mm:ss a");
String time = df.format(new Date());
if ((txtUserSignIn.getText() != null && txtUserSignIn.getText().isEmpty())) {
String userSignInErrorMessage = "Sorry, Please Try Again";
JOptionPane.showMessageDialog(new JFrame(), userSignInErrorMessage, "Incorrect Sign In",JOptionPane.ERROR_MESSAGE);
//setting focus
txtUserSignIn.setText("");
txtUserSignIn.requestFocus();
} else {
for(int i = 1; i < userSignInNumber.size(); i++) {
// If number is already in array, remove it
if(txtUserSignInName.equals(userSignInNumber.get(i))) {
userSignInNumber.remove((Integer)txtUserSignInName);
System.out.println(txtUserSignInName + " has signed out");
txtLoggedInUsers.append(txtUserSignInName + " has signed out at " + time + "n");
break;
} else { // If number is not in the array, add it to the array
System.out.println(txtUserSignInName + " has signed in");
txtLoggedInUsers.append(txtUserSignInName + " has signed in at " + time + "n");
break;
}
}
System.out.println(userSignInNumber);
}
}
列表并不适合您想要做的事情。您最好使用Set接口实现之一。set提供了快速 contains()/add()/remove()方法,您可以使用这些方法,而不必在循环中手动遍历所有元素。如果您确实由于某种原因需要快速遍历所有元素,那么LinkedHashSet就可以很好地工作。例如:
Set<Integer> signedIn = new LinkedHashSet<>();
...
if (signedIn.add(loginNumber)) {
// The set was modified, therefore this is a new login
} else {
// The number was already present, log-off the user.
signedIn.remove(loginNumber);
}
...
if (signedIn.contains(loginNumber)) {
// Allow the user to...
} else {
// Error, user not signed in
}
你的实现有很多问题。
当数组下标从0
开始时,循环从1
开始,因此您将跳过第一个条目。
然后你总是在检查完第二项后立即将break
排除在循环之外,因此不要检查任何其他项目。
一个更好的方法是使用Set
,不仅是为了删除重复,而且是作为存储谁登录的主要方式。然后你可以用contains
方法检查一个数字是否在集合中,这样你就不需要手动循环(这意味着你不必处理与从列表中删除项目相关的问题,而你正在循环它)。