Поместите значение в карту в Java * без * обновления существующего значения, если оно существует - PullRequest
8 голосов
/ 10 декабря 2011

Я бы хотел выполнить следующие функции:

if (!map.contains(key)) {
  map.put(key, val);
}

Обновление: предположим, что это не HashMap, поэтому карта реализована в виде дерева какого-то рода.

Однако обратите внимание, что это немного неэффективно, так как если мы попадем в, если мы на самом деле ищем карту дважды.Я бы на самом деле хотел сделать что-то подобное:

map.put_if_new_key(key, val);

Есть идеи, как это сделать на Java?

Ответы [ 4 ]

7 голосов
/ 10 декабря 2011

Если вы планируете вставлять новые элементы в подавляющем большинстве случаев.

ValType temp = map.put(key, val);
if(temp != null)
    map.put(key, temp);

Я не думаю, что в целом это хорошая идея, но стоит подумать, можете ли вы достаточно рассуждать о своем случае использования.

Подумайте над этим, если вы можете использовать конкретную реализацию карты вместо интерфейса карты, вы можете сделать это с помощью NavigableMap

Map sub = map.subMap(key, true, key, true);
if (!sub.contains(key)) {
  sub.put(key, val);
}

Поскольку поддерево будет иметь размер 0 или 1 узел, повторной работы не будет.

3 голосов
/ 10 декабря 2011

Если у вас есть ConcurrentMap<K, V>, существует метод putIfAbsent:

Если указанный ключ еще не связан со значением, свяжите его с даннымзначение.Это эквивалентно

if (!map.containsKey(key))
    return map.put(key, value);
else
    return map.get(key);

, за исключением того, что действие выполняется атомарно.

Однако этот метод не существует в Map<K, V>.

1 голос
/ 10 декабря 2011

Я не думаю, что предложенный вами код неэффективен.Посмотрите, если key уже есть в карте, то это поиск по одной карте.И даже для случаев, когда ключ не найден, нет 2 поисков.Только 1 поиск и 1 вставка в карту.

0 голосов
/ 10 декабря 2011

Я не думаю, что есть какой-либо способ обойти проверку "contains ()", чтобы увидеть, существует ключ или нет.

Посмотрите здесь, чтобы увидеть, может ли это быть альтернативой для вас:

Что происходит, когда дублирующий ключ помещается в HashMap?

...