0

のリストがあり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.

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

または、を使用する代わりに明示的に実行したい場合は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 に答える