[英]Java chained map of collections
我有一個Things
列表,每個都有一個類別 (一個int
)。 我想結束了一個地圖,其中關鍵是類別,和值是所有的列表Things
這一類的。 目前我不得不手動完成這個,所以我想知道是否有某種我不知道的類型。
目前我做的事情如下:
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
可以檢索多個值。
在評論的其他地方已經建議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);
}
在發現Apache MultiKey之后,拖網文檔顯示了MultiHashMap ,它似乎可以滿足我的需求。
MultiMap是一種語義略有不同的Map。 將值放入地圖會將值添加到該鍵的Collection。 獲取值將始終返回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”的列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.