2011-05-28 7 views
4

私はguavaのGoogleコレクションライブラリを使用していますが、私は最新のバージョンと考えています。guava(google)からの削除Multimapはキー自体を削除しません。どうして?それを行う方法?

与えられたKの値のマップから最終(K、V)のペアを削除すると、マップにはまだKのエントリが含まれています。ここでVは空のコレクションです。

私は地図にこのエントリが含まれていないと思います。なぜ私はそれを削除できませんか?それとも、できれば、どう?

これはおそらく私が逃した単純なものです。コード例を示します。ありがとう。

// A plain ordinary map. 
    Map<Integer, Integer> hm = new HashMap<Integer, Integer>(); 
    hm.put(1, 2); 
    hm.remove(1); 
    // Value of key 1 in HashMap: null 
    System.out.println("Value of key 1 in HashMap: " + hm.get(1)); 

    // A list multimap. 
    ListMultimap<Integer, Integer> lmm = ArrayListMultimap.<Integer, Integer> create(); 
    lmm.put(1, 2); 
    lmm.remove(1, 2); 
    // Value of key 1 in ArrayListMultiMap: [] 
    System.out.println("Value of key 1 in ArrayListMultiMap: " + lmm.get(1)); 

    // A set multimap. 
    SetMultimap<Integer, Integer> smm = HashMultimap.<Integer, Integer> create(); 
    smm.put(1, 2); 
    smm.remove(1, 2); 
    // Value of key 1 in HashMultimap: [] 
    System.out.println("Value of key 1 in HashMultimap: " + smm.get(1)); 

答えて

4

全くMultimapからの根本的なエントリを削除するには、あなたがMapビューを使用する必要があります:あなたがマルチマップ内のキーの最後の値を削除すると、実際にキーが削除され

multimap.asMap().remove(key); 
+3

マルチマップでの削除は、実際には値コレクションが空になったら、マルチマップから削除されます。 –

+0

興味深い。それについて知らなかった。それは、文書化されていない機能のようですが(javadocsではこれについて何も見ていませんでした)。このような実装の詳細は将来変更される可能性があります... –

+1

私はそれが変わりやすいとは思わない。それは規則的な地図の意味論に従っている。変更する場合、 'containskey'の動作が正しいことを確認する必要があります。 –

6

地図から。 あなたはマルチマップから値を取得するときのキーに関連付けられたコレクションが存在しない場合は、それが入るの実装を参照して、空のコレクションを返します。例えば「のcontainsKey」

System.out.println("ListMultimap contains key 1? " + lmm.containsKey(1)); 

の振る舞いを参照してください。 AbstractMultimap:

/** 
* {@inheritDoc} 
* 
* <p>The returned collection is not serializable. 
*/ 
@Override 
public Collection<V> get(@Nullable K key) { 
    Collection<V> collection = map.get(key); 
    if (collection == null) { 
    collection = createCollection(key); 
    } 
    return wrapCollection(key, collection); 
} 
関連する問題