Как обновить значение, учитывая ключ в hashmap? - PullRequest
558 голосов
/ 11 ноября 2010

Предположим, у нас есть HashMap<String, Integer> в Java.

Как обновить (увеличить) целочисленное значение ключа строки для каждого существования найденной строки?

Можно было бы удалить и повторно ввести пару, но это было бы проблемой.
Другим способом было бы просто поставить новую пару и заменить старую.

В последнем случае, что произойдет, еслиесть конфликт хеш-кода с новым ключом, который я пытаюсь вставить?Правильное поведение для хеш-таблицы будет состоять в том, чтобы назначить для нее другое место или составить список из нее в текущем сегменте.

Ответы [ 17 ]

5 голосов
/ 22 января 2018

Более чистое решение без исключения NullPointerException:

map.replace(key, map.get(key) + 1);
2 голосов
/ 15 июня 2012

Используйте цикл for для увеличения индекса:

for (int i =0; i<5; i++){
    HashMap<String, Integer> map = new HashMap<String, Integer>();
    map.put("beer", 100);

    int beer = map.get("beer")+i;
    System.out.println("beer " + beer);
    System.out ....

}
2 голосов
/ 28 октября 2017

Поскольку я не могу комментировать несколько ответов из-за меньшей репутации, я опубликую решение, которое я применил.

for(String key : someArray)
{
   if(hashMap.containsKey(key)//will check if a particular key exist or not 
   {
      hashMap.put(hashMap.get(key),value+1);// increment the value by 1 to an already existing key
   }
   else
   {
      hashMap.put(key,value);// make a new entry into the hashmap
   }
}
1 голос
/ 07 августа 2014

Здесь есть вводящие в заблуждение ответы на этот вопрос, которые подразумевают, что метод put Hashtable заменит существующее значение, если ключ существует, это не верно для Hashtable, а скорее для HashMap. См. Javadoc для HashMap http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html#put%28K,%20V%29

0 голосов
/ 18 августа 2012

Попробуйте:

HashMap hm=new HashMap<String ,Double >();

ПРИМЕЧАНИЕ:

String->give the new value; //THIS IS THE KEY
else
Double->pass new value; //THIS IS THE VALUE

Вы можете изменить либо ключ, либо значение в вашей хэш-карте, но вы не можете изменить оба одновременно.

0 голосов
/ 06 февраля 2019

Использовать встроенную функцию Java8 'computeIfPresent'

Пример:

public class ExampleToUpdateMapValue {

    public static void main(String[] args) {
        Map<String,String> bookAuthors = new TreeMap<>();
        bookAuthors.put("Genesis","Moses");
        bookAuthors.put("Joshua","Joshua");
        bookAuthors.put("Judges","Samuel");

        System.out.println("---------------------Before----------------------");
        bookAuthors.entrySet().stream().forEach(System.out::println);
        // To update the existing value using Java 8
        bookAuthors.computeIfPresent("Judges", (k,v) -> v = "Samuel/Nathan/Gad");

        System.out.println("---------------------After----------------------");
        bookAuthors.entrySet().stream().forEach(System.out::println);
    }
}
0 голосов
/ 15 июля 2017
Integer i = map.get(key);
if(i == null)
   i = (aValue)
map.put(key, i + 1);

или

Integer i = map.get(key);
map.put(key, i == null ? newValue : i + 1);

Integer - это примитивные типы данных http://cs.fit.edu/~ryan/java/language/java-data.html,, поэтому вам нужно вынуть его, выполнить какой-то процесс, а затем вернуть обратно. если у вас есть значение, которое не относится к типам данных Primitive, вам нужно только извлечь его, обработать, не возвращая его обратно в хэш-карту.

...