Синхронизировать несколько источников ArrayLists в один список целей - PullRequest
2 голосов
/ 16 августа 2010

Требуется загрузить список элементов (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 ]

3 голосов
/ 16 августа 2010

Вам нужно написать собственную реализацию списка, который будет инициализирован двумя списками, и делегировать выполнение всех методов им обоим, обеспечивая безопасность операций мутации.

1 голос
/ 19 августа 2010

Вы можете создать подкласс 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());
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...