【发布时间】:2017-01-22 14:21:10
【问题描述】:
我有一个对象 User 的数组列表,其中包含用户的用户名和密码。我创建了一个updateUsername 方法来尝试更改用户的用户名,在其中我使用了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 是单独控制器中的列表视图 - 我已在单独控制器中实例化:
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 是如何找到索引的吗?
-
您是否在
User类中覆盖了equals? -
indexOf使用equals(Object),你能告诉我们它的代码吗? -
如果不覆盖
equals,两个对象只有当它们是同一个对象时才是equals。 -
indexOf的 JavaDoc 是公开的,因此您应该阅读它以了解它的工作原理以及您需要做什么才能正确使用它。当您不知道如何实现equals时,您为什么不对此进行研究呢?你不是第一个在 SO 上问这个问题的人。