#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()
orsearchUsers()
, в зависимости от того, какой из них является методом, который проверяет, существует ли пользователь.2. Привет, спасибо за комментарий. Я просто добавил метод, чтобы он был более понятным для того, что я пытаюсь сделать.
3. Я предлагаю вам использовать a
Set
вместо aList
. Набор — это набор элементов, не содержащих дубликатов. Часто используемая реализацияHashSet
имеет сложность времени поиска O (1) , в то времяArrayList
как у O (n) .4. В вашем коде есть отдельные ошибки.
fullnameField.getText().length() < 6
имеет значение false6
, поэтому ваша ошибка никогда не отображается, и принимаются строки длиной 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, возвращающим простое сообщение, содержащее переменные из конструктора. Спасибо!