Удаление из гуавы (Google) Multimap никогда не удаляет сам ключ.Зачем?Как это сделать? - PullRequest
4 голосов
/ 28 мая 2011

Я использую библиотеку коллекций Google из гуавы, полагаю, самая последняя версия.

Я обнаружил, что после удаления последней пары (K, V) с карты для заданного значения K карта все еще содержит запись для 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));

Ответы [ 2 ]

6 голосов
/ 28 ноября 2011

На самом деле, когда вы удаляете последнее значение для ключа в мультикарте, ключ удаляется с карты. Посмотрите, например, поведение 'containsKey'

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

Однако, когда вы получаете значения из мультикарты, если с ключом нет связанной коллекции, он вернет пустую коллекцию, см. Реализацию get в 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);
}
5 голосов
/ 28 ноября 2011

Чтобы полностью удалить базовую запись из Multimap, вам необходимо использовать Map представление:

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