У меня есть arraylist объекта User
, который содержит имя пользователя и пароль пользователя. Я создал метод updateUsername
, чтобы попытаться изменить имя пользователя пользователя, и в нем я использовал indexOf
, но он всегда возвращает -1 (он не может найти указанного пользователя в arraylist). МетодindexOf всегда возвращает -1
updateUsername:
public void updateUsername(User user, String username) {
ArrayList<User> users = getAllUsers();
int i = users.indexOf(user);
user.setUsername(username);
users.set(i,user);
synToFile(users);
}
Этот метод вызывается в контроллере при нажатии кнопки:
public JFXListView<Label> lview2;
@FXML
void changeUsername(ActionEvent event) {
String username = newUserField.getText();
UserDAO theDAO = new UserDAO();
Label lbl = lview2.getSelectionModel().getSelectedItem();
//the items in the listview are of object label
User u = theDAO.getUser(lbl.getText());
theDAO.updateUsername(u,username);
ObservableList<Label> userList = theDAO.storeUsers();
lview2.setItems(userList);
}
lview2 является ListView в отдельном контроллере - Я инстанцирован здесь отдельный контроллер:
changeUsernameController cu = (changeUsernameController)fxmlLoader.getController();
cu.lview2 = listView;
Не думаю, что это необходимо, но я добавил методы getAllUsers()
, synToFile()
и getUser()
здесь также:
public ArrayList<User> getAllUsers() {
Scanner sc;
String record = null;
String[] fields;
ArrayList<User> users = new ArrayList<User>();
try {
sc = new Scanner(dataFile);
while (sc.hasNextLine()) {
record = sc.nextLine();
fields = record.split(";");
String username = fields[0];
String password = fields[1];
User u = new User();
u.setPassword(password);
u.setUsername(username);
users.add(u);
}
} catch (FileNotFoundException e) {
System.out.println("No record found!");
//e.printStackTrace();
}
return users;
}
public void synToFile(ArrayList<User> userList) {
if (userList == null) {
return;
}
try {
FileWriter out = new FileWriter(dataFile);
for (User u: userList) {
out.append(u.toString() + "\n");
}
out.close();
}catch (IOException e) {
e.printStackTrace();
}
}
public User getUser(String username) {
ArrayList<User> users = getAllUsers();
User user = null;
for (User u: users) {
if (u.getUsername().equals(username)) {
user = u;
break;
}
}
return user;
}
Примечание: Я добавил отладки строки в методе updateUsername()
- ArrayList как положено быть, и пользовательский объект также является правильным.
Класс пользователя:
package Server;
import java.util.ArrayList;
public class User {
private String username;
private String password;
private ArrayList<Double> scoreList=new ArrayList<Double>();
public User() {
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String toString() {
return username + ";" + password;
}
public String usernameString() {
return username;
}
}
Показать класс пользователя, пожалуйста. Вы понимаете, как indexOf находит индекс? –
Вы переопределили 'equals' в классе' User'? – Eran
'indexOf' использует' equals (Object) ', вы можете показать нам код для этого? –