我有一系列项目到达,这些项目在我的一个数据结构中使用,我需要一种方法来跟踪那些保留的项目。
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项,然后过滤它们。
编辑:这对我来说似乎很难,因为我真的不希望类Foo或类Baz对插入索引有任何意识,我希望这种方法可以扩展,这样我就不必拥有StateManager也要注意它。
我在考虑使用装配工作为List&lt;&gt;和地图&lt;&gt;在fooList和bazMap中使用,每个装饰器都具有对主List&lt;&gt;的引用。在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)
答案 0 :(得分:1)
我不明白究竟是在寻找什么。如果问题是维持Foos和Bars的插入顺序,那么你可以将它们的索引(i
存储在你的循环中),并根据它排序,通过排序列表或通过TreeMap
或者其他的东西。另一种选择是使用LinkedHashMap(再次使用key的索引)来维护插入顺序。
答案 1 :(得分:0)
我不明白过滤的来源。如果您要删除第2步和第4步中的项目,是否隐式过滤了它们?
如果您正在询问如何将两个集合合并为一个列表,那非常简单。
List<Item> items = new ArrayList<Item>(fooList.size() + bazMap.size());
items.addAll(fooList);
items.addAll(bazMap.values());
也许你可以详细说明“按照添加的顺序”部分。 fooList可以轻松拥有该属性,但是bazMap的顺序可能不会具有该属性。如果你的意思是foo被添加,那么baz,然后是foo,你需要最终得到的集合处于相同的顺序,这仍然更复杂。
答案 2 :(得分:0)
将项目添加到单独的主项目列表中,并从主列表和特定类型数据结构中删除项目。
即
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
*/
}