Проверка существования ключа в Map

356
11 февраля 2017, 06:47

Необходимо в HashMap сохранить "ключ -> массив значений".

Map<Integer, List<Data>> myMap = new HashMap();

Если записи с таким номером нет, то заполняем myMap:

if (!myMap.containsKey(pos)) {
    List<Data> dataArray = new ArrayList();
    dataArray.add(new Data(a, b, c, d));
    myMap.put(pos, dataArray);
}

Далее идет снова проверка на существование, и если ключ есть, то выводим значение:

if (myMap.containsKey(pos)) 
    myMap.get(pos)

Проблема в том, что если при первой проверке ключа нет, то заполняется, однако второе условие тоже срабатывает. Но если заново вызвать функцию, содержащую эти проверки, то для pos, который, по идее, уже есть в Map, containsKey говорит, что якобы записи с ключом pos еще нет, и начинает заново заполнять Map. Но на самом деле такой ключ в Map уже есть. Как это исправить?

P.S. После добавления в Map containsKey показывает, что запись есть. Map у меня глобальный. И если вызвать containsKey в другом участке кода, то containsKey уже вернет false при том, что запись есть. Почему так, и как это исправить?

Answer 1

У себя для похожей цели использую такой метод.

/**
 * @param checkMap мапа, куда необходимо добавить инфу
 * @param key      ключ для мапы выше, по которому ищем значения
 * @param value    значение, которое необходимо добавить
 * @param isSet    если true коллекция инициализируется как HashSet, иначе как ArrayList
 * @param <K>      Тип ключа
 * @param <V>      Тип значения
 * @return true если в мапе был данный ключ
 */
public static <K, V> boolean addToGroupMap(Map<K, Collection<V>> checkMap, K key, V value, boolean isSet) {
    assert checkMap != null;
    boolean result = false;
    Collection<V> vList = checkMap.get(key);
    if (vList == null) {
        vList = isSet ? new HashSet<V>() : new ArrayList<V>();
        vList.add(value);
        checkMap.put(key, vList);
    } else {
        vList.add(value);
        result = true;
    }
    return result;
}
READ ALSO
android:Взаимодействие Service и UI

android:Взаимодействие Service и UI

Подскажите наиболее простую, надежную и наиболее "синхронную" схему взаимодействия Компонента с GUI и ServiceВ ИНЕТЕ описано много схем, но, как...

308
Исполняемые файлы Java

Исполняемые файлы Java

Вопрос такой, если создатьjar или

373
JsonRPC маппинг

JsonRPC маппинг

Я создал простую JsonRPC server (Netty socketServer) для выполнения определенных задач, общих для нашей команды, но вызывающиеся из разных сетейСервер получает...

397