0

我有一个列表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.

4

2 回答 2

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();
     }
   });

或者,如果你想明确地做而不是 using Multimaps.index,它可能更简单:

 ListMultimap<Integer, Thing> multimap = ArrayListMultimap.create();
 for (Thing t : listOfThings) {
    multimap.put(t.getCategory(), t);
 }
于 2012-08-06T14:52:40.613 回答
0

发现 Apache MultiKey 后,通过搜索文档发现了MultiHashMap,它似乎可以满足我的要求。

MultiMap 是语义稍有不同的 Map。将值放入映射中会将值添加到该键处的集合中。获取一个值将始终返回一个集合,其中包含放入该键的所有值。此实现使用 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”的列表。

于 2012-08-06T14:19:34.930 回答