我有一系列的項目到達了我的數據結構中的一個,我需要一種方法來跟蹤那些保留的項目。Java:自動過濾列表?
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和巴茲項目列表,它們在fooList和bazMap中按照它們添加的順序找到。從fooList和bazMap刪除或移動的項目不應位於返回的列表中。
我該如何實現? SOME_LARGE_NUMBER足夠大,我沒有可用的內存來保留所有Foo和Baz項目,然後過濾它們。
編輯:這似乎很難,因爲我真的不希望Foo類或類巴茲有一個插入索引的任何意識,我想的辦法是可擴展的,這樣我就不會必須讓StateManager知道它。
我也許想使用裝飾爲列表<的>和地圖<>在fooList和bazMap使用,每個都具有到主列表<基準的裝飾在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)
如果我做fooList.set(K,someFoo),它會清除該列表中的老項目。另外,是的,如果按順序添加的項目是[Foo foo1,Baz baz1,Baz baz2,Foo foo2,Foo foo3],那麼我需要保持該順序。 – 2010-06-03 15:02:59