【问题标题】:Sync multiple source ArrayLists into single target list将多个源 ArrayLists 同步到单个目标列表中
【发布时间】:2010-08-16 11:48:00
【问题描述】:

需要从两个不同的表中加载项目列表(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

【问题讨论】:

    标签: java arraylist


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可以创建一个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());
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多