Java链式集合的地图

时间:2012-08-06 14:19:35

标签: java collections types map

我有一个Things列表,每个列表都有一个类别(一个int)。我最终想要的是一个Map,其中键是类别,值是该类别的所有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中可以检索多个值。

2 个答案:

答案 0 :(得分:2)

在评论的其他地方已经建议OP应该使用Guava - 除其他外,它提供了泛型,与链接的Apache文档不同 - 所以这里是Guava解决方案。 (披露:我向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);
 }

答案 1 :(得分:0)

发现Apache MultiKey后,拖网文件显示MultiHashMap,这似乎是我想做的。

  

MultiMap是一种语义略有不同的Map。放一个价值   进入地图会将值添加到该键的Collection。得到一个   value将始终返回一个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”的列表。