如何添加两个将抽象类扩展为一个ArrayList的不同类的ArrayLists?

时间:2015-07-22 10:20:15

标签: java arraylist

所以我有两个以下的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迭代器问题,在我解决这个问题之前,我想知道问题是不是就在这里。谢谢。

3 个答案:

答案 0 :(得分:3)

假设EmployeeManager类都扩展了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实例投放到ManagerEmployee,那么您仍然可以获得这些特殊元素/方法:

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)

我猜你的ManagerEmployee课程正在扩展/实施你的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
}