У меня есть ряд поступающих элементов, которые используются в одной из моих структур данных, и мне нужен способ отслеживать эти элементы, которые сохраняются.
interface Item {}
class Foo implements Item { ... }
class Baz implements Item { ... }
class StateManager
{
List<Foo> fooList;
Map<Integer, Baz> bazMap;
public List<Item> getItems();
}
Что я хочу, так это если я сделаю следующее:
for (int i = 0; i < SOME_LARGE_NUMBER; ++i)
{
/* randomly do one of the following:
* 1) put a new Foo somewhere in the fooList
* 2) delete one or more members from the fooList
* 3) put a new Baz somewhere in the bazMap
* 4) delete one or more members from the bazMap
*/
}
тогда, если я сделаю вызов StateManager.getItems (), я хочу вернуть список тех элементов Foo и Baz, которые находятся в fooList и bazMap, в порядке их добавления. Элементы, которые были удалены или удалены из fooList и bazMap, не должны быть в возвращаемом списке.
Как я мог это реализовать? SOME_LARGE_NUMBER достаточно большой, чтобы у меня не было памяти, чтобы сохранить все элементы Foo и Baz, а затем отфильтровать их.
edit: мне это кажется трудным, потому что я не хочу, чтобы класс Foo или класс Baz знали о индексе вставки, и я хочу, чтобы подход был масштабируемым, чтобы у меня не было StateManager знать об этом тоже.
Возможно, я подумал об использовании декораторов для List <> и Map <>, используемых в fooList и bazMap, причем каждый из декораторов имеет ссылку на главный List <>, возвращаемый в getItems (), чтобы декораторы могли молча делай всю работу.
Также просто для ясности, скажем, операции над fooList и bazMap:
fooList.add(foo1);
bazMap.put(3, baz1);
fooList.add(foo2);
fooList.add(foo3);
bazMap.put(10, baz2);
bazMap.put(4, baz3);
fooList.set(1, foo4);
bazMap.put(7, baz4);
bazMap.put(3, baz5);
fooList.add(foo5);
bazMap.put(7, baz6);
fooList.set(0, foo6);
bazMap.put(4, baz7);
fooList.add(foo1);
тогда список, возвращаемый getItems, должен быть
[foo3, baz2, foo4, baz5, foo5, baz6, foo6, baz7, foo1]
с конца fooList = [foo6, foo4, foo3, foo5, foo1] и конечного bazMap = {10: baz2, 4: baz7, 3: baz5, 7: baz6}. Элементы foo1, baz1, foo2, baz3 и baz4 были смещены (с добавлением foo1 на последнем шаге)