将多个源ArrayLists同步到单个目标列表中

时间:2010-08-16 11:48:00

标签: java arraylist

需要从两个不同的表中加载项目列表(ArrayList)。由于复杂的Hibernate映射,它们无法作为一个ArrayList加载。所以它们在类定义中由两个不同的Hibernate包分别加载。当我使用它们时,我想组合成单个列表。所以我正在考虑编写如下函数,

private List<Item> combinedList = new ArrayList<Item>();

public List<Item> getCombinedList()
{
   combinedList.clear();
   combinedList.addAll(getList1());
   combinedList.addAll(getList2());
   return combinedList;
}

getCombinedList()将用于显示项目并用于其他只读操作。任何删除或修改或添加操作仍将在List1和List2中执行(因为它将由Hibernate处理)。

我的问题是如何在发生变化时有效地将getCombinedList()与源列表同步?

更新:每次调用getCombinedList()获取最新项目效率低下。我正在寻找一种方法来同步基础数据结构combinedList

2 个答案:

答案 0 :(得分:3)

您必须编写自己的列表实现,该列表将使用两个列表进行初始化,并将所有方法执行委派给它们,以保护变异操作。

答案 1 :(得分:1)

您可以创建AbstractList的子类,该子类委派给两个单独的列表。

public class CombinedList<E> extends AbstractList<E> {
  public CombinedList(List<E> list1, List<E> list2) {
    this.list1 = list1;
    this.list2 = list2;
  }
  List<E> list1;
  List<E> list2;
  public E get(int i) {
    return (i < list1.size()) ? list1.get(i) : list2.get(i - list1.size());
  }
  public boolean add(E e) {
    return list2.add(e);
  }
  public E remove(int i) {
    return (i < list1.size()) ? list1.remove(i) : list2.remove(i - list1.size());
  }
}