Java: список автофильтров? - PullRequest
1 голос
/ 03 июня 2010

У меня есть ряд поступающих элементов, которые используются в одной из моих структур данных, и мне нужен способ отслеживать эти элементы, которые сохраняются.

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 на последнем шаге)

Ответы [ 3 ]

1 голос
/ 03 июня 2010

Я тоже не понимаю, что именно ищут. Если проблема заключается в поддержании порядка вставки Foos и Bars, то вы можете сохранить их индекс (i в вашем цикле) и упорядочить их в соответствии с этим, либо отсортировав список, либо через TreeMap, либо что-то еще. Другим вариантом будет использование LinkedHashMap (снова с использованием индекса для ключа), который поддерживает порядок вставки.

0 голосов
/ 03 июня 2010

Добавьте элементы в отдельный основной список элементов и удалите элементы как из основного списка, так и из структур данных конкретного типа.

т.е.

for (int i = 0; i < SOME_LARGE_NUMBER; ++i)
{
    /* randomly do one of the following:
     * 1) put a new Foo somewhere in the fooList
     * 1a) put a new Foo at the end of masterList
     * 2) delete one or more members from the fooList
     * 2a) delete the same members from the masterList
     * 3) put a new Baz somewhere in the bazMap
     * 3a) put a new Baz at the end of masterList
     * 4) delete one or more members from the bazMap
     * 4a) delete the same members from masterList
     */
}
0 голосов
/ 03 июня 2010

Я не понимаю, откуда происходит фильтрация. Если вы удаляете элементы в шагах 2 и 4, не фильтруются ли они неявно?

Если вы спрашиваете, как объединить две коллекции в один список, это довольно просто.

List<Item> items = new ArrayList<Item>(fooList.size() + bazMap.size());
items.addAll(fooList);
items.addAll(bazMap.values());

Может быть, вы можете подробнее остановиться на части "в порядке их добавления". FooList может легко иметь это свойство, но порядок в bazMap, вероятно, не будет иметь этого свойства. И если вы имеете в виду, что добавляется foo, то baz, затем foo, и вам нужно, чтобы итоговая результирующая коллекция была в том же порядке, что еще сложнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...