我有一个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
中可以检索多个值。
答案 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”的列表。