Проверьте, зарегистрировано ли имя пользователя уже в ArrayList

#java #arraylist

#java #arraylist

Вопрос:

У меня есть эта программа JFrame, которая просто регистрирует пользователей по их полному имени, имени пользователя, городу, возрасту. У меня есть проверки для текстовых полей в методе. Если вы нажмете кнопку register JButton, то он проверяет, правильно ли вы ввели информацию, а затем создает нового пользователя в списке массива.

Мне нужно добавить проверку, которая сообщит мне, когда я нажму кнопку регистрации, существует ли имя пользователя. Я попытался создать оператор if в своем методе для проверки моих текстовых полей прямо перед созданием нового пользователя в списке областей, но он просто игнорируется. Я попытался сделать это, если оператор перед методом для кнопки регистрации, и все равно ничего. Я вставлю свой код прослушивателя действий ниже с моими методами.

Редактировать: публикую метод, который я использую для большей ясности.

 public void fieldChecks()
    {
        if(fullnameField.getText().length() < 6)
        {
            Helpers.showError("Name must have at least 7 characters");
            return;
        }

        if(usernameField.getText().length() < 4)
        {

                Helpers.showError("Username must have at least 4 characters!");
            return;
        }

        if(cityField.getText().length() < 5)
        {
            Helpers.showError("City must have at least 5 characters");
            return;
        }

        if(passwordField.getText().length() < 8)
        {
            Helpers.showError("Name must have at least 8 characters");
            return;
        }

        if(ageField.getText().length() == 0)
        {
            Helpers.showError("Age is a required field!");
            return;
        }
        //check if our boolean is true or false from Helpers class
        if(Helpers.ageCheck(ageField.getText()) == false)
        {
            Helpers.showError("Age must be a whole number!");
            return;
        }

        String fullname = fullnameField.getText();
        String username = usernameField.getText();
        String city = cityField.getText();
        String password = passwordField.getText();
        int age = Integer.parseInt(ageField.getText());
        String sex = " ";
        //check which radio button is selected
        if(maleOption.isSelected())
        {
            sex = "Male";
        }else
            {
                sex = "Female";
            }




            //we have to create a user now by having the above new vars in the user brackets in order of our Class constructor
        User myUser = new User(fullname,username, city, password, sex, age);

        //create the default add function for our arraylist that we added in the vars above
        myUsers.add(myUser);
        Helpers.showConfirmation("User added!");

    }

  
 @Override
    public void actionPerformed(ActionEvent e) {

        if(e.getSource() == registerButton)
        {
            //this method checks if my text fields have more 
            //than X charactes typed before it creates a user.
            // This method also adds the new user to my array list 
         //after the checks are complete
            fieldChecks();
        }
        else if(e.getSource() == printButton)
        {
            printUser();
        }
        else if(e.getSource() == searchButton)
        {
            searchUsers();
        }
  

Комментарии:

1. Опубликованного вами кода недостаточно, чтобы помочь вам найти причину проблемы. Пожалуйста, опубликуйте хотя бы код fieldChecks() or searchUsers() , в зависимости от того, какой из них является методом, который проверяет, существует ли пользователь.

2. Привет, спасибо за комментарий. Я просто добавил метод, чтобы он был более понятным для того, что я пытаюсь сделать.

3. Я предлагаю вам использовать a Set вместо a List . Набор — это набор элементов, не содержащих дубликатов. Часто используемая реализация HashSet имеет сложность времени поиска O (1) , в то время ArrayList как у O (n) .

4. В вашем коде есть отдельные ошибки. fullnameField.getText().length() < 6 имеет значение false 6 , поэтому ваша ошибка никогда не отображается, и принимаются строки длиной 6, но в вашем сообщении об ошибке говорится, что строка должна быть длиной не менее 7 символов. Хорошей идеей было бы поддерживать тесное соответствие бизнес-логики и требований, поэтому инвертирование условия и проверка length >= 7 могут быть лучше, чтобы избежать таких единичных ошибок.

Ответ №1:

После:

 if(usernameField.getText().length() < 4)
    {
        Helpers.showError("Username must have at least 4 characters!");
        return;
    }
  

Я бы проверил, взято ли это имя пользователя с помощью следующего кода

 if(myUsers.size() > 0)
    {
       for(User user : myUsers)
          {
              if(usernameField.getText() == user.username)
                {
                    Helpers.showError("This username is taken");
                    return;
                }
          }
    }
  

Комментарии:

1. Привет, большое спасибо! Я пробовал это с помощью цикла for i, но безрезультатно. Я могу попробовать foreach, поскольку это имеет больше смысла.

Ответ №2:

Я предполагаю, что myUser является ArrayList типа myUser. Вы хотите переопределить метод equals в своем классе myUser, а затем вызвать contains . Посмотрите, как @Override equals но вот короткая демонстрация.

 public static void main(String[] args) {
    List<myUser> users = new ArrayList<>();

    users.add(new myUser("Billy", "xBillx"));

    List<myUser> usersToAdd = new ArrayList<>();
    usersToAdd.add(new myUser("Jill", "jilly"));
    usersToAdd.add(new myUser("Billy", "xBillx"));

    for(myUser newUser : usersToAdd){
        if(!users.contains(newUser)){
            users.add(newUser);
            System.out.println("New user added: "   newUser.fullname);
        } else {
            System.out.println("User already exists "   newUser.fullname);
        }
    }

}


static class myUser{
    final private String fullname;
    final private String username;
    myUser(String fullName, String username){
        this.fullname = fullName;
        this.username = username;
    }

    @Override
    public boolean equals(Object user){
        if(user == this){
            return true;
        }
        if(user instanceof myUser amp;amp;
                this.username.equals(((myUser) user).username) amp;amp;
                this.fullname.equals(((myUser) user).fullname)) {
            return true;
        }

        return false;
    }
}
  

он печатает:

Добавлен новый пользователь: Jill

Пользователь уже существует, Билли

Редактировать: допущена ошибка, вы не можете сравнивать строки с == в Java

Комментарии:

1. Привет, да, ArrayList имеет тип User. User — это мой класс с конструктором внутри и toString, возвращающим простое сообщение, содержащее переменные из конструктора. Спасибо!