Обновите значение hashmap, используя ключ с помощью getOrDefault - PullRequest
0 голосов
/ 05 мая 2018

У меня есть HashMap:

HashMap<string, Integer> hmap = new HashMap<>();

где я хочу увеличить значение HashMap. Чтобы избежать nullPointer Exception, если ключ не существует, я проверяю его! Допустим, данные:

//201803271 - 1000
//201803271 - 1000
//201803272 - 1000

//inside a loop i read the data...
  if (hmap.get("201803271") != null) {
      hmap.put("201803271", hmap.get("201803271") + 1000);
  }else{
      hmap.put("201803271", 1000);
  }
//end of loop

, который работает, как я получаю:

201803271 - 2000
201803272 - 1000

Но я прочитал этот вопрос Как обновить значение, учитывая ключ в хэш-карте Java? и есть решение использовать метод Java 8 getOrDefault. Я попробовал это

hmap.put("201803271", count.getOrDefault("201803271", 1000) + 1000)

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

201803271 - 3000
201803272 - 2000

Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Вы можете сделать это так:

map.put(key, map.getOrDefault(key, 0) + inc);

или

map.compute(key, (k, v) -> v == null ? inc : v + inc);
0 голосов
/ 05 мая 2018

Java 8 представил merge метод для Map интерфейса только для этого типа проблемы:

hmap.merge("201803271", 1000, Integer::sum);

Это означает «положить 1000 для этого ключа, но если этот ключ уже имеет значение, добавьте к нему 1000».

Причина, по которой ваше решение не работает, состоит в том, что вы получаете 1000 по умолчанию, а затем добавляете 1000 к нему. Чтобы сделать это правильно с getOrDefault, вам нужно заменить 1000 на 0 в getOrDefault. hmap.put("201803271", count.getOrDefault("201803271", 0) + 1000))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...