我有一系列到达的物品,这些物品用在我的一个数据结构中,并且我需要一种方法来跟踪保留的那些物品。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知道要么。我在想可能要对fooList和bazMap中使用的List 和Map 使用装饰器,每个装饰器都引用getItems()中返回的主List ,这样装饰器将默默地执行所有腿部动作。同样为了清楚起见,假设对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) (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 我也不明白到底在寻找什么。如果问题在于保持Foos和Bars的插入顺序,则可以存储它们的索引(i在循环中),并根据其排序方式,既可以对列表进行排序,也可以通过TreeMap或其他方式进行排序。另一种选择是使用LinkedHashMap(再次使用索引作为键)来维护插入顺序。 (adsbygoogle = window.adsbygoogle || []).push({});
09-13 01:12