Перейти к содержимому

Как изменить значение в map java

  • автор:

Как добавить значение по ключу в Map java [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

Учебные задания допустимы в качестве вопросов только при условии, что вы пытались решить их самостоятельно перед тем, как задать вопрос. Пожалуйста, отредактируйте вопрос и укажите, что именно вызвало у вас трудности при решении задачи. Например, приведите код, который вы написали, пытаясь решить задачу

Закрыт 4 года назад .

Надо, чтобы при добавлении ключа и значения добавлялось значение

Алексей 3000 Дмитрий 9000 Антон 3000 Алексей 7000 Антон 8000 

Пример вывода:

Отслеживать

26.2k 7 7 золотых знаков 31 31 серебряный знак 48 48 бронзовых знаков

задан 29 авг 2019 в 8:08

никита снигиревиch никита снигиревиch

11 1 1 серебряный знак 1 1 бронзовый знак

и в чём вопрос? что не получилось?

29 авг 2019 в 9:54

ну у меня добавить значение не получается, а получается только перезаписать значение

29 авг 2019 в 10:10

покажите код, в вопрос его добавьте

29 авг 2019 в 10:19

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

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

  • Проверить есть ли значение для ключа
    • Если есть, то получить их
    • Прибавить к ним нужное число
     public static void main(String[] args) < Mapmap = new HashMap<>(); updateValue(map, "Алексей", 3000); updateValue(map, "Дмитрий", 9000); updateValue(map, "Антон", 3000); updateValue(map, "Алексей", 7000); updateValue(map, "Антон", 8000); System.out.println(map.toString()); > public static void updateValue(Map map, String key, Integer value) < if (map.containsKey(key)) < map.put(key, map.get(key) + value); >else < map.put(key, value); >> 

    Как изменить значение в map java

    Для изменения значения в map необходимо вызвать метод put() из объекта класса Map , указать ключ, по которому будет найдена пара, и новое значение для этой пары:

    // Cоздаем мапу с ключом класса Integer и значением класса String MapInteger, String> map = new HashMap<>(); map.put(1, "Egor"); // Кладем в мапу значение Egor c ключом 1 // Выводим мапу в консоль System.out.println(map);// => map.put(1, "Nikita"); // Изменяем значение в мапе с Egor на Nikita с ключом 1 System.out.println(map); // => // P.S. значение изменилось 

    Самый эффективный способ увеличить значение Map в Java – искать только один раз

    Этот вопрос может считаться слишком простым, но его часто задают на форумах. В этом посте я расскажу об одном способе, который ищет только ключ в Map ONCE .

    Давайте сначала посмотрим на пример. Скажем, я создаю список частоты строк, используя карту , где каждый ключ является строкой , которая подсчитывается, а значением является целое число, которое увеличивается каждый раз при добавлении строки . Прямой способ достижения этого

    int count = map.containsKey(string) ? map.get(string) : 0 ;
    map.put(string, count + 1 );

    Этот фрагмент кода выполняется довольно медленно, потому что он содержит три потенциально дорогостоящих операции на карте, а именно содержит K.Key () , get () и [put ()] (http://docs.oracle.com/javase/7/docs/ api / java / util / Map.html # put (K, V)) . Каждый требует поиска ключа на карте. Теперь давайте проведем рефакторинг кода для повышения производительности.

    Целое число против MutableInteger против AtomicInteger

    Одна важная причина, по которой мы должны вызвать три дорогостоящие операции, – это использование Integer для подсчета. В Java Integer является неизменным . Это не позволяет нам изменять целочисленное значение после построения. Поэтому, чтобы увеличить счетчик, мы должны сначала получить целое число из карты, затем создать другое новое целое число, добавив его, и вернуть его обратно на карту.

    Чтобы сделать счетчик изменчивым, есть несколько способов. Один из них – просто создать свой собственный MutableInteger , как показано ниже.

    public class MutableInteger < private int val; public MutableInteger( int val) < this .val = val; public int get() < return val; public void set( int val) < this .val = val;

    Другим способом может быть использование AtomicInteger в Java, который используется в приложениях, таких как счетчики с атомным приращением. Но основной выбор для AtomicInteger – если вы хотите добиться безопасности потоков с помощью операций с целым числом. Поэтому его нельзя использовать в качестве замены для целого числа. Исходя из этого, если потокобезопасность не является серьезным фактором для вашего проекта, я не рекомендую использовать AtomicInteger .

    Поиск ключа только один раз

    После использования MutableInteger мы можем изменить приведенный выше код на

    if (map.containsKey(string)) < MutableInteger count = map.get(string); count.set(count.get() + 1 ); map.put(string, new MutableInteger( 1 )); MutableInteger count = map.get(string); if (count != null ) < count.set(count.get() + 1 ); map.put(string, new MutableInteger( 1 ));

    В худшем случае, когда ключ не был виден раньше, код будет искать ключ дважды: один для получения, другой для установки. Это намного лучше, чем предыдущий. Но мы НЕ должны быть удовлетворены прямо сейчас и остановиться. Если вы проверили метод [Map.put ()] (http://docs.oracle.com/javase/7/docs/api/java/util/Map.html#put (K, V)) в документе Java, вы обнаружите, что этот метод вернет the previous value associated with key . Это означает, что мы можем объединить получение и настройку в одно. Однако вы можете задаться вопросом: если мы не получим счетчик первым, как мы можем установить новый счетчик? Теперь мы наконец-то коснемся самой сложной части этого поста: мы можем упростить установку счетчика нулевой частоты !

    public int incrementCount(K key, int count) < MutableInteger tmpCount = new MutableInteger( 0 ); MutableInteger oldCount = map.put(key, tmpCount); if (oldCount != null ) < count += oldCount.get(); tmpCount.set(count); return count;

    Еще один счетчик

    Похоже, что помещение всех необходимых операций в класс будет полезным для будущего использования. Поэтому я создаю класс Counter и делаю его общедоступным. Счетчик определяет коллекцию, которая подсчитывает, сколько раз объект появляется в коллекции. Предположим, у вас есть счетчик, который содержит . Вызов getCount () для «a» вернет 2, в то время как вызов keySet () вернет . Этот класс работает как Map , но с различными методами для простого получения / установки / увеличения количества объектов и вычисления различных функций с помощью счетчика. Конструктор Counter и метод addAll () могут использоваться для копирования содержимого другого Counter. Класс Counter изменяется в соответствии с IntCounter и AbstractMapBag .

    Некоторые выделенные операции на счетчике включают

    • incrementCount () и decmentCount () : Добавляет / вычитает данное количество к текущему числу для данного ключа. Если ключ не был виден раньше, предполагается, что он имеет счетчик 0, и, таким образом, метод приращения установит его счетчик на заданную сумму. Для декремента будет установлено значение -1.
    • getCount () : возвращает текущий счетчик для данного ключа, который равен 0, если его раньше не видели.
    • keysAt () , keysAbove () и keysBelow () : возвращает набор ключей, число которых равно , выше или ниже заданного порогового значения. Этот набор может иметь 0 элементов, но не будет нулевым.
    • argmin () и argmax () : находит и возвращает ключ в этом счетчике с наименьшим / наибольшим числом. Если имеется несколько минимальных / максимальных значений, возвращается случайное значение. Возвращает ноль, если этот счетчик пуст.

    Map: специфичные операции

    В Map типы ключей и значений определяются пользователем. При этом благодаря доступу к значениям по их ключу открываются различные возможности для обработки записей: от получения значения по ключу, до фильтрации ключей и значений по отдельности. В этом разделе находится описание функций из стандартной библиотеки для обработки ассоциативных списков.

    Получение ключей и значений

    Для того чтобы получить значение из Map , вы должны передать его ключ в качестве аргумента функции get() . Также поддерживается сокращённый синтаксис — [key] . Если такой ключ не найден, то вернётся null . Помимо этого существует функция getValue() , которая в случае отсутствия ключа бросит исключение. Также есть еще две функции для решения проблемы отсутствия ключа:

    • getOrElse() — работает так же, как и для списков: если ключ не найден, то вернётся результат выполнения лямбды.
    • getOrDefault() — если ключ не найден, то вернёт заданное значение по умолчанию.
    fun main() < val numbersMap = mapOf("one" to 1, "two" to 2, "three" to 3) println(numbersMap.get("one")) // 1 println(numbersMap["one"]) // 1 println(numbersMap.getOrDefault("four", 10)) // 10 println(numbersMap["five"]) // null //numbersMap.getValue("six") // exception! >

    Если для выполнения операций вам требуются все ключи или все значения из Map , то воспользуйтесь свойствами keys и values . keys — это набор ( Set ) всех ключей, а values — коллекция всех значений.

    fun main() < val numbersMap = mapOf("one" to 1, "two" to 2, "three" to 3) println(numbersMap.keys) // [one, two, three] println(numbersMap.values) // [1, 2, 3] >

    Фильтрация

    Вы можете фильтровать ассоциативный список с помощью функции filter() как и другие коллекции. Для этого передайте filter() предикат с Pair в качестве аргумента, что позволит использовать и ключ, и значение в предикате.

    fun main() < val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key11" to 11) val filteredMap = numbersMap.filter < (key, value) ->key.endsWith("1") && value > 10> println(filteredMap) // > 

    Помимо этого существует две функции фильтрации, специфичные именно для ассоциативного списка: filterKeys() для фильтра по ключам и filterValues() для фильтра по значениям. Обе возвращают новый ассоциативный список, в котором все записи соответствуют заданному предикату. Предикат функции filterKeys() проверяет только ключи элементов, а предикат функции filterValues() проверяет только значения.

    fun main() < val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key11" to 11) val filteredKeysMap = numbersMap.filterKeys < it.endsWith("1") >val filteredValuesMap = numbersMap.filterValues < it < 10 >println(filteredKeysMap) // println(filteredValuesMap) // > 

    Операторы plus и minus

    Из-за наличия доступа к элементам по их ключам операторы plus ( + ) и minus ( — ) работают с ассоциативными списками иначе, чем с другими коллекциями. Оператор plus возвращает Map , которая содержит в себе элементы обоих операндов: первым операндом должен быть Map , а вторым может быть Pair или другая Map . Если второй операнд содержит в себе записи с ключами, которые есть в первом операнде, то в результирующую Map попадут записи из второго операнда.

    fun main() < val numbersMap = mapOf("one" to 1, "two" to 2, "three" to 3) println(numbersMap + Pair("four", 4)) // println(numbersMap + Pair("one", 10)) // println(numbersMap + mapOf("five" to 5, "one" to 11)) // > 

    Оператор minus создаёт Map на основе первого операнда, исключая те записи, ключи которых есть во втором операнде. Таким образом, второй операнд может быть либо одним ключом, либо коллекцией ключей: списком, множеством и так далее.

    fun main() < val numbersMap = mapOf("one" to 1, "two" to 2, "three" to 3) println(numbersMap - "one") // println(numbersMap - listOf("two", "four")) // > 

    Подробнее об использовании операторов plusAssign ( += ) и minusAssign ( -= ) с изменяемыми ассоциативными списками см. ниже Операции записи.

    Операции записи

    Изменяемые ассоциативные списки предлагают специфичные для них операции записи. Такие операции позволяют изменять содержимое ассоциативного списка, используя доступ к значениям по ключу.

    Все операции записи придерживаются следующих правил:

    • Значения можно обновлять. В свою очередь, ключи никогда не меняются: как только вы добавили запись, её ключ остаётся неизменным.
    • Для каждого ключа всегда есть одно значение, связанное с ним. Вы можете добавлять и удалять записи целиком.

    Ниже описаны функции для операций записи из стандартной библиотеки, доступные для использования с изменяемыми ассоциативными списками.

    Добавление и обновление записи

    Для добавления в изменяемый ассоциативный список новой пары «ключ-значение» используйте функцию put() . Когда новая запись помещается в LinkedHashMap (реализация Map по умолчанию), она добавляется в неё таким образом, что при итерации Map она отображается последней. В отсортированных ассоциативных списках положение новых элементов определяется порядком их ключей.

    fun main() < val numbersMap = mutableMapOf("one" to 1, "two" to 2) numbersMap.put("three", 3) println(numbersMap) // > 

    Для добавления нескольких записей за раз, используйте функцию putAll() . В качестве аргумента она принимает Map или группу из Pair : Iterable , Sequence , или Array .

    fun main() < val numbersMap = mutableMapOf("one" to 1, "two" to 2, "three" to 3) numbersMap.putAll(setOf("four" to 4, "five" to 5)) println(numbersMap) // > 

    И put() , и putAll() перезаписывают значения, если указанные ключи уже существуют в Map . Поэтому вы можете использовать их, чтобы обновить значения записей.

    fun main() < val numbersMap = mutableMapOf("one" to 1, "two" to 2) val previousValue = numbersMap.put("one", 11) println("value associated with 'one', before: $previousValue, after: $") // 11 println(numbersMap) // > 

    Помимо этого, вы можете использовать упрощённый вариант для добавления записей в ассоциативный список. Есть два способа:

    • Оператор plusAssign ( += ).
    • [] .
    fun main() < val numbersMap = mutableMapOf("one" to 1, "two" to 2) numbersMap["three"] = 3 // calls numbersMap.put("three", 3) numbersMap += mapOf("four" to 4, "five" to 5) println(numbersMap) // > 

    Если вызвать эти операторы с ключом, который уже существует в ассоциативном списке, то его значение будет перезаписано.

    Удаление записей

    Для удаления записи из изменяемой Map , используйте функцию remove() . При вызове remove() , вы можете передать ей либо только ключ, либо и ключ, и его значение. При этом, если вы передадите и ключ, и значение, то элемент с этим ключом будет удалён только в том случае, если его значение совпадает с переданным значением.

    fun main() < val numbersMap = mutableMapOf("one" to 1, "two" to 2, "three" to 3) numbersMap.remove("one") println(numbersMap) // numbersMap.remove("three", 4) // ничего не удаляет println(numbersMap) // > 

    Также вы можете удалять записи из ассоциативного списка используя свойства keys или values : просто вызовите функцию remove() для них. При вызове remove() с values , будет удалена только первая запись с таким значением.

    fun main() < val numbersMap = mutableMapOf("one" to 1, "two" to 2, "three" to 3, "threeAgain" to 3) numbersMap.keys.remove("one") println(numbersMap) // numbersMap.values.remove(3) println(numbersMap) // > 

    Оператор minusAssign ( -= ) для изменяемых Map тоже доступен.

    fun main() < val numbersMap = mutableMapOf("one" to 1, "two" to 2, "three" to 3) numbersMap -= "two" println(numbersMap) // numbersMap -= "five" // ничего не удаляет println(numbersMap) // > 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *