簡體   English   中英

Java鏈式集合的地圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM