所以我有两个以下的arraylists:
private List<Manager> _managers = new ArrayList<Manager>(); //Manager extends User
private List<Employee> _employees = new ArrayList<Employee>(); //Employee extends User
我希望有一个结合了这两者的arraylist,存储所有用户,包括员工和经理。
目前我正在尝试以下解决方案:
private List<User> _usrs = new ArrayList<User>();
/*
* function that I use before I get the current user list, preventing getting a outdated version of it
*/
public void refreshUserList() {
this._usrs.clear(); //prevent duplicates
this._usrs.addAll(_employees); //add all employees to user list
this._usrs.addAll(_managers); //add all managers to user list
}
这是解决这个问题的好方法吗? 我在迭代这个列表时遇到了一些nullPointer迭代器问题,在我解决这个问题之前,我想知道问题是不是就在这里。谢谢。
答案 0 :(得分:3)
假设Employee
和Manager
类都扩展了User
类,那么是的,这是一个很好的解决方案。但是,如果要防止重复,可以使用Set:
private Set<User> _usrs = new HashSet<>();
/*
* function that I use before I get the current user set, preventing getting a outdated version of it
*/
public void refreshUserList() {
this._usrs.addAll(_employees); //add all employees to user set
this._usrs.addAll(_managers); //add all managers to user set
}
您无需调用clear();
,因为集合不会添加重复元素。
这样,您将丢失仅出现在Managers或Employees中的特殊变量/方法,因为您将拥有的所有变量/方法都可供用户使用。但是,如果您将User
设置的每个_usrs
实例投放到Manager
或Employee
,那么您仍然可以获得这些特殊元素/方法:
for (User user : _usrs) {
if (user instanceof Manager) {
Manager mng = (Manager) user;
mng.manage(); // or whatever managers do that employees don't
} else { //if no other classes extend the User class
Employee emp = (Employee) user;
emp.work(); // or whatever employees do that managers don't :P
}
}
答案 1 :(得分:1)
您可以使用Set而不是List来解决您的重复问题,至于迭代器问题,您必须添加有关它发生位置的更多信息。
答案 2 :(得分:1)
我猜你的Manager
和Employee
课程正在扩展/实施你的User
课程,只有这样你才能合并两个arraylists。
如果您想防止重复,请使用Set,如果您还想维护订单,请使用LinkedHashSet。
private LinkedHashSet<User> _usrs = new LinkedHashSet<User>();
public void refreshUserList() {
usrs.clear(); //prevent duplicates
usrs.addAll(_employees); //add all employees to user list
usrs.addAll(_managers); //add all managers to user list
}