3

コレクションの「非正規化」マップを反復処理するための最良の方法は何ですか?

たとえば、次のマップがあります。

Map<String, List<String>> relations;

各キー->各値を反復処理するために、次のようにします。

for (Entry<String,List<String>> e : relations.entries()) {
   for (String s : e.getValue()) {
       System.out.println(e.getKey() + " - " + s);
   }
}

デコレータなどでそれを解決するエレガントな方法はありますか?

私は次のようなものを見つけたいと思っています:

for(Entry e : Collections.getDenormalizeEntriesFromMapOfCollection(myMap)) {
   System.out.println(e.getKey() + " - " + e.getValue());
}

それでも同じ結果が得られます。2番目の状況では、キーごとに1つのエントリ->コレクションアイテムがあります。

4

3 に答える 3

4

MultiMapグアバの実装を確認することをお勧めします。すでにこの種のイテレータがあります。

をに変換するMap<K, Collection<V>にはMultiMap<K, V>、ユーティリティメソッドを使用できます。

public static <K,V> Multimap<K,V> toMultiMap(Map<K,? extends Collection<V>> m) {

    LinkedListMultimap<K, V> multimap = LinkedListMultimap.create();

    for (Entry<K, ? extends Collection<V>> e : m.entrySet())
        multimap.putAll(e.getKey(), e.getValue());

    return multimap;
}

使用法:

public static void main(String[] args) {

    Map<String, List<Integer>> map = new HashMap<String, List<Integer>>();

    map.put("Hello", Arrays.asList(1, 2));
    map.put("World!", Arrays.asList(3));

    Multimap<String, Integer> multimap = toMultiMap(map);

    Iterator<Entry<String, Integer>> it = multimap.entries().iterator();

    while (it.hasNext())
        System.out.println(it.next());
}

出力:

Hello=1
Hello=2
World=3
于 2012-06-05T08:41:21.573 に答える
3

を反復処理するために使用している方法ほどエレガントな方法はありませんMap<String, List<String>>。しかし、もっと洗練された方法は、 Guava ListMultimapentries()を使用することです。これは、ネストされたループなしで直接反復できるメソッドを提供します。

于 2012-06-05T08:42:02.527 に答える
0

Eclipseのデバッガーはまさにそれを実行していると思います。実装を確認できます。それ以外の場合は、たとえば、Collectionsフレームワークがこれをサポートしていないため、ユーティリティクラスにヘルパーメソッドを記述できます。

于 2012-06-05T08:37:12.810 に答える