如何将新数据添加到 Arraylist 以及如何删除用户输入重复项?



我正在拍摄的是能够从我的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方法检查一个数字是否在集合中,这样你就不需要手动循环(这意味着你不必处理与从列表中删除项目相关的问题,而你正在循环它)。

相关内容

  • 没有找到相关文章

最新更新