2013-10-07 3 views
11

私はマルチマップについて多くの例を見ていますが、Google Gauvaが異なる理由を理解できませんでしたか?HashMapとHashMultimapの違い

Multimap<Integer, Set<String>> option4 = HashMultimap.create(); // Gauva 

Map<Integer, Set<String>> opt = new HashMap<Integer, Set<String>>(); //Core Java 

上記の両方がデータを保持する場合と同じであるかどうか、

+0

この[グアバウィキ](https://code.googleを読みます.com/p/guava-libraries/wiki/NewCollectionTypesExplained#Multimap)のページを参照してください。 – Xaerxess

+4

最初の定義は2番目の定義と同じではありません。 2番目のものは 'Map >>'(これがあなたが必要としているとは思えません)か、最初のものは 'Multimap 'でなければなりません。 –

答えて

13

MultiMap<A, B>会合型Collection<B>の値を持つタイプAのキー(したがって、その名前マルチマップ)

Map<A, B>関連付け

したがって、タイプBの値を持つタイプAのキーMultiMap<Integer, Set<String>>Map<Integer, Collection<Set<String>>と表示されます。これは、the api documentationを読んで明白になるはずです。

+1

これは非常に簡単で有用だった:) –

12

違いは、2番目のコアJava実装では、挿入する前にセットがあるかどうかを確認する必要があります。グアバのマルチマップはあなたのためにそれを世話します。コアJavaを使用

:グアバと

Set<String> innerSet = opt.get(key); 
if (innerSet == null) { 
    innerSet = new HashSet<String>(); 
    opt.put(key, innerSet); 
} 
innerSet.add(value); 

opt.put(key, value); 

グアバは、値を格納するように設定それ以外の場合は不在を初期化の世話をする(例えば、2つのスレッドを停止し任意のスレッドの問題の世話をします同じキーの新しいSetを並列に作成することから)、また、手作業で実装する必要のあるいくつかの便利なメソッドを提供します(Setすべての値をすべて取得するなど)。

+0

@LouisWasserman:編集のためにありがとう: – Rich

0

最初にcom.google.common.collect.Multimapはjava.util.Mapではなく、別の階層にあります。

第2に、Map<Integer, Set<String>>ですべての操作を行うことができますが、HashMultimapが実装を準備している間に、それらを自分で実装する必要があります。

1

あなたは何かを誤解しました。これらもほぼ同じではありません:あなたの例では

Multimap<Integer, Set<String>> option4 = HashMultimap.create(); // Guava 
Map<Integer, Set<String>> opt = new HashMap<Integer, Set<String>>(); //Core Java 

opt4は、文字列のセットの集合に単一Integerをマッピングします。 それは正確にMultimapを使用する点です。第2次元を明示的に処理する必要はありません。

SetMultimap<Integer, String> multimap = HashMultimap.create(); // Guava 

、あなたは、このようなマップビューを取得することができます::だから実際には、正しい(等価)の宣言は次のようになり

Map<Integer, Set<String>> mapView = multimap.asMap(); 
関連する問題