2012-08-06 49 views
0

我有一個Things的列表,其中每個列表都有一個類別(一個int)。我想結束的是一個Map,其中關鍵是類別,並且值是該類別的所有Things的列表。目前我必須手動完成這項工作,所以我想知道是否有某種我不知道的類型。Java鏈式收集圖

目前我做類似如下:

List<Thing> things = thingGenerator.generateTheThings(); 
Map<Integer,List<Thing>> categoriesOfThing = new TreeMap<Integer,List<Thing>>(); 

for(Thing thing : things) { 
    int thingCategory = thing.getCategory(); 
    List<Thing> oneCategoryOfThing; 
    if(categoriesOfThing.containsKey(thingCategory) { 
     oneCategoryOfThing = categoriessOfThings.get(thingCategory); 
    } 
    else { 
     oneCategoryOfThing = new ArrayList<Thing>(); 
    } 

    oneCategoryOfThing.add(thing); 
    categoriesOfThing.put(thingCategory,oneCategoryOfThing); 
} 

for(int i = 0; i < numberOfCategories; i++) { 
    List<Thing> similarThings = categoriesOfThing.get(i); 
    foo(similarThings); 
} 

我想什麼可以做的東西有點像以下:

List<Thing> things = thingGenerator.generateTheThings(); 
ChainedMap<Integer,Thing> categoriesOfThing = new ChainedMap<Integer,Thing>(); 

for(Thing thing : things) { 
    categoriesOfThing.add(thing.getCategory(), thing); 
} 

for(int i = 0; i < numberOfTypes; i++) { 
    List<Thing> similarThings = categoriesOfThing.get(i); 
    foo(similarThings); 
} 

很像Apache MultiKey允許爲了在地圖中使用多個鍵,我想要在List中檢索多個值。

+0

是你的事情的模板類?即'東西' – Wug 2012-08-06 14:21:39

+0

不,它只是包含數據和一些簡單的方法。 – Edd 2012-08-06 14:27:10

+0

好的,所以當你說「這個值是所有」那類*類型*的事物「的列表時,你的意思是你按價值而不是按類型查找?你的措辭讓我覺得你正在尋找類似於'Map ,List >'(這可能不是正確的語法) – Wug 2012-08-06 14:31:41

回答

2

在評論中的其他地方,OP應該使用Guava--除了其它的東西,它提供了泛型,與鏈接的Apache文檔不同 - 所以這裏是Guava解決方案。 (披露:我貢獻番石榴)

ListMultimap<Integer, Thing> multimap = 
    Multimaps.index(listOfThings, new Function<Thing, Integer>() { 
    public Integer apply(Thing thing) { 
     return thing.getCategory(); 
    } 
    }); 

或者,如果你想這樣做,而不是明確地使用Multimaps.index的,它可能更簡單:

ListMultimap<Integer, Thing> multimap = ArrayListMultimap.create(); 
for (Thing t : listOfThings) { 
    multimap.put(t.getCategory(), t); 
} 
0

發現Apache MultiKey後,通過拖網文檔顯示MultiHashMap,這似乎是我想要的。

MultiMap是一個略有不同的語義的地圖。將值 放入地圖將會將該值添加到該密鑰的集合中。獲取 值將始終返回一個Collection,將所有值放在 之內。該實現使用ArrayList作爲集合。

例如:

MultiMap mhm = new MultiHashMap(); 
    mhm.put(key, "A"); 
    mhm.put(key, "B"); 
    mhm.put(key, "C"); 
    Collection coll = mhm.get(key); 

coll將是包含 「A」 的列表, 「B」, 「C」。

+4

去番石榴和它的MultiMap - 它大部分與Apache的this1一樣,但你會有一個機會去了解這個awsome庫。 – dantuch 2012-08-06 14:44:19