我正在拍摄的是能够从我的GUI中的文本字段中获取输入并将其放入ArrayList中。然后我需要检查数组,看看我是否已经在数组中有Integer。如果是这样,我需要删除两个整数,因此整数不再在数组中。如果它不是ArrayList的副本,我还需要能够添加Integer。
这样做的目的是让用户使用号码登录。我的愿景是让他们在登录或退出时输入他们唯一的号码(就像时钟一样)。如果他们的号码不在阵列中,他们就会登录。如果他们的号码在arraylist中,那么他们就会退出。
这是我到目前为止的代码,我遇到退出问题。它不断发送数组中的第二个值作为唯一能够注销的值。我试过修理它,似乎无法弄清楚出了什么问题。如果我发布我的整个程序或者这个代码片段足以弄清楚它是否会更有帮助,请告诉我。
谢谢,
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);
}
}
答案 0 :(得分:0)
您的实施存在许多问题。
当数组索引从1
开始时,循环从0
开始,因此您正在跳过第一个条目。
然后,在检查完第二项后,您会立即break
离开循环,所以不要检查任何其他项目。
更好的方法是使用Set
,而不仅仅是删除重复项,而是作为存储登录对象的主要方式。然后,您可以使用{轻松检查数字是否在集合中{1}}方法,因此您不需要手动循环(这意味着您不必处理与在循环中删除项目时相关的问题)。
答案 1 :(得分:0)
列表并不适合您要做的事情。最好使用其中一个Set interface实现。集合提供了您可以使用的快速 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
}