2011-08-26 20 views
3

マップを回転できるUtilライブラリ(commonsXXXなど)内に関数がありますか。地図を回転するUtil機能?

私は、に "rotate"するMap<User,Set<Permission>>があります。

私は実装が難しくないと知っていますが、既存の一般的なライブラリを使用すると、「2度ホイールを作成しないでください。

+0

はあなたが導入を検討しています多対多の関係にあるUserPermissionクラス?すべてのUserPermissionを簡単に反復し、必要な構造を持つ2つのマルチマップを作成できます。 –

+0

@Javid Jamae:それほど複雑ではなく、マップは接続されていなくてもよい。回転されたものは未接続のコピーにすることができます。 – Ralph

答えて

4

私はあなたの説明と同じことをする必要がありました。私はcommons-collectionsからマルチマップを使い、私自身の逆関数を書きました。

しかし、元のマップをSetMultimapに変更した場合(キーを値のコレクションにマッピングすると、マルチマップが好きですが、彼らは)簡単に値を挿入作るために、あなたはcom.google.common.collect.Multimaps.invertFromを使用することができます。

public static <K,V,M extends Multimap<K,V>> M invertFrom(Multimap<? extends V,? extends K> source, 
             M dest) 

Copies each key-value mapping in source into dest, with its key and value reversed. 

Parameters: 
    source - any multimap 
    dest - the multimap to copy into; usually empty 
Returns: 
    dest 
0

GuavaのBiMap.inverse()をご覧ください。それ以外の場合はMapUtils.invertMap()を使用できます。

あなたはおそらくこれを考えましたが、マップを逆にするにはキーと値が一意でなければなりません。詳しく見に

EDIT、ノー公に利用できるコンポーネントがあなたのためにことを行いますかなり確信しています。私は、逆Map<A,B>からMap<B,A>に質問を読んだ。

+0

これが行うかどうかはわかりません。 'inverse()'は 'Map 、User>'を返します。 – musiKk

0

私は、あなたがそういうものをいくつかのユーティリティー・ライブラリーで見つけることは考えにくいと思います。

あなたが探しているのは単純な逆転ではないので、元のマップ値からPermissionオブジェクトをアンパックする必要があります。

+2

まだグアバはそれを持っています。 :-) –

1

は、私はどちらかの共通のライブラリでこれを見つけることができませんでしたので、ここで私の実装です:

public static <K, V> Map<V, Set<K>> invertMapToSet(Map<K, ? extends Set<V>> ksToVs) { 
    Map<V, Set<K>> vsToKs = new HashMap<V, Set<K>>(); 
    for (Entry<K, ? extends Set<V>> kToVs : ksToVs.entrySet()) { 
     for (V v : kToVs.getValue()) { 
      Set<K> ks = vsToKs.get(v); 
      if (ks == null) { 
       ks = new HashSet<K>(); 
       vsToKs.put(v, ks); 
      } 
      ks.add(kToVs.getKey()); 
     } 
    } 
    return vsToKs; 
} 
関連する問題