2012-08-06 48 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