从番石榴中删除(谷歌)Multimap永远不会删除密钥本身.为什么?怎么办?

Puz*_*led 4 java collections multimap guava

我正在使用番石榴的谷歌收藏库,我相信最新的版本.

我发现,一旦我从地图中移除了给定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));
Run Code Online (Sandbox Code Playgroud)

Hie*_*mus 6

实际上,当您删除多图中某个键的最后一个值时,该键将从地图中删除.例如,参见'containsKey'的行为

System.out.println("ListMultimap contains key 1? " + lmm.containsKey(1));
Run Code Online (Sandbox Code Playgroud)

但是,当您从multimap获取值时,如果没有与该键关联的集合,它将返回一个空集合,请参阅AbstractMultimap中get的实现:

/**
 * {@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);
}
Run Code Online (Sandbox Code Playgroud)


Eti*_*veu 5

要从中完全删除基础条目Multimap,您需要使用Map视图:

multimap.asMap().remove(key);
Run Code Online (Sandbox Code Playgroud)

  • 在multimap上删除实际上确保一旦值集合为空,就会从多图表中删除该键. (3认同)