2010-08-16 55 views
2

需要从两个不同的表中加载项目列表(ArrayList)。由于复杂的Hibernate映射,它们不能作为一个ArrayList加载。所以它们在类定义中分别由两个不同的Hibernate包加载。当我使用它们时,我想合并成单个列表。所以我的想法写一个函数如下,将多个源ArrayLists同步到单个目标列表

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

回答

3

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

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()); 
    } 
} 
相关问题