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

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

  • автор:

Как изменить значение в 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. значение изменилось 

Изменить значение элемента HashMap

Доброго времени суток, форумчане!
Подскажите пожалуйста, что не так
Делаю метод, который изменяет количество ингредиента по заданному имени ингредиента и количеству на которое нужно изменить, нижепредставленный метод меняет количество во всём HashMap storeSet

1 2 3 4 5 6 7 8 9 10 11 12
public void changeIngredientQuantityInStore(String inputName, long inputQuantity) { for (Ingredient ingr : storeSet) { if (ingr.getQuantity() - inputQuantity >= 0) { if (ingr.getName() == inputName) { long i = ingr.getQuantity() + inputQuantity; ingr.setQuantity(i); } } else { System.out.println(IConstants.INGREDIENT_NUMBER_LIMIT); } } }
1 2 3 4 5 6 7 8 9 10
public class Ingredient implements Serializable { public int Id; public String name; public long quantity; public Ingredient( int Id, String name, long quantity) { this.Id = Id; this.name = name; this.quantity = quantity; }
1 2 3 4 5 6 7 8 9 10 11 12 13
public class IngredientStore implements IterableIngredient> { private SetIngredient> storeSet = new HashSet(); public boolean ingredientPresentInStore; public void initializeStore() { storeSet.add(new Ingredient(1, "колбаса", 2000)); storeSet.add(new Ingredient(2, "сыр", 2000)); storeSet.add(new Ingredient(3, "грибы", 2000)); storeSet.add(new Ingredient(4, "майонез", 2000)); storeSet.add(new Ingredient(5, "лук", 2000)); storeSet.add(new Ingredient(6, "помидор", 1000)); }

Добавлено через 31 минуту
Люди! Есть кто живой?

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

Интерфейс Map представляет отображение или иначе говоря словарь, где каждый элемент представляет пару «ключ-значение». При этом все ключи уникальные в рамках объекта Map. Такие коллекции облегчают поиск элемента, если нам известен ключ — уникальный идентификатор объекта.

Следует отметить, что в отличие от других интерфейсов, которые представляют коллекции, интерфейс Map НЕ расширяет интерфейс Collection.

Среди методов интерфейса Map можно выделить следующие:

  • void clear() : очищает коллекцию
  • boolean containsKey(Object k) : возвращает true, если коллекция содержит ключ k
  • boolean containsValue(Object v) : возвращает true, если коллекция содержит значение v
  • Set> entrySet() : возвращает набор элементов коллекции. Все элементы представляют объект Map.Entry
  • boolean equals(Object obj) : возвращает true, если коллекция идентична коллекции, передаваемой через параметр obj
  • boolean isEmpty : возвращает true, если коллекция пуста
  • V get(Object k) : возвращает значение объекта, ключ которого равен k. Если такого элемента не окажется, то возвращается значение null
  • V getOrDefault(Object k, V defaultValue) : возвращает значение объекта, ключ которого равен k. Если такого элемента не окажется, то возвращается значение defaultVlue
  • V put(K k, V v) : помещает в коллекцию новый объект с ключом k и значением v. Если в коллекции уже есть объект с подобным ключом, то он перезаписывается. После добавления возвращает предыдущее значение для ключа k, если он уже был в коллекции. Если же ключа еще не было в коллекции, то возвращается значение null
  • V putIfAbsent(K k, V v) : помещает в коллекцию новый объект с ключом k и значением v, если в коллекции еще нет элемента с подобным ключом.
  • Set keySet() : возвращает набор всех ключей отображения
  • Collection values() : возвращает набор всех значений отображения
  • void putAll(Map map) : добавляет в коллекцию все объекты из отображения map
  • V remove(Object k) : удаляет объект с ключом k
  • int size() : возвращает количество элементов коллекции

Чтобы положить объект в коллекцию, используется метод put , а чтобы получить по ключу — метод get . Реализация интерфейса Map также позволяет получить наборы как ключей, так и значений. А метод entrySet() возвращает набор всех элементов в виде объектов Map.Entry .

Обобщенный интерфейс Map.Entry представляет объект с ключом типа K и значением типа V и определяет следующие методы:

  • boolean equals(Object obj) : возвращает true, если объект obj, представляющий интерфейс Map.Entry , идентичен текущему
  • K getKey() : возвращает ключ объекта отображения
  • V getValue() : возвращает значение объекта отображения
  • V setValue(V v) : устанавливает для текущего объекта значение v
  • int hashCode() : возвращает хеш-код данного объекта

При переборе объектов отображения мы будем оперировать этими методами для работы с ключами и значениями объектов.

Классы отображений. HashMap

Базовым классом для всех отображений является абстрактный класс AbstractMap , который реализует большую часть методов интерфейса Map. Наиболее распространенным классом отображений является HashMap , который реализует интерфейс Map и наследуется от класса AbstractMap.

Пример использования класса:

import java.util.*; public class Program < public static void main(String[] args) < Mapstates = new HashMap(); states.put(1, "Germany"); states.put(2, "Spain"); states.put(4, "France"); states.put(3, "Italy"); // получим объект по ключу 2 String first = states.get(2); System.out.println(first); // получим весь набор ключей Set keys = states.keySet(); // получить набор всех значений Collection values = states.values(); //заменить элемент states.replace(1, "Poland"); // удаление элемента по ключу 2 states.remove(2); // перебор элементов for(Map.Entry item : states.entrySet()) < System.out.printf("Key: %d Value: %s \n", item.getKey(), item.getValue()); >Map people = new HashMap(); people.put("1240i54", new Person("Tom")); people.put("1564i55", new Person("Bill")); people.put("4540i56", new Person("Nick")); for(Map.Entry item : people.entrySet()) < System.out.printf("Key: %s Value: %s \n", item.getKey(), item.getValue().getName()); >> > class Person < private String name; public Person(String value)< name=value; >String getName() >

Чтобы добавить или заменить элемент, используется метод put, либо replace, а чтобы получить его значение по ключу — метод get. С помощью других методов интерфейса Map также производятся другие манипуляции над элементами: перебор, получение ключей, значений, удаление.

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

Всем доброго дня!

 public static Map variableDictionary = new TreeMap (); . // Установить новое значение по заданному ключу public void setValue (String var, int value) < Set  entries = variableDictionary.entrySet (); for (Map.Entry entry : entries) < if (entry.getKey () == var) < entry.setValue (value); break; > > >

Сделано согласно туториалу (Java 7):

With the entrySet view, it is also possible to change the value associated with a key by calling a Map.Entry’s setValue method during iteration (again, assuming the Map supports value modification to begin with). Note that these are the only safe ways to modify a Map during iteration; the behavior is unspecified if the underlying Map is modified in any other way while the iteration is in progress.

и все работает. Но терзают смутные сомнения: неужели для того, чтобы изменить значение, соответствующее ключу, надо перебирать всю коллекцию? А если в ней несколько сотен тысяч ключей? Как можно быстрее «выйти» на заданный ключ?

Приходиться заниматься гадостью — зарабатывать на жизнь честным трудом (Б.Шоу)
Re: Перебор коллекции для изменения

От: RomikT
Дата: 20.06.12 07:58
Оценка: +1

Здравствуйте, fplab, Вы писали:

F>и все работает. Но терзают смутные сомнения: неужели для того, чтобы изменить значение, соответствующее ключу, надо перебирать всю коллекцию? А если в ней несколько сотен тысяч ключей? Как можно быстрее «выйти» на заданный ключ?

variableDictionary.put(key, value);

А ваш код работать будет через раз потому что вы строки на == сравниваете.

Re[2]: Перебор коллекции для изменения

От: fplab http://fplab.h10.ru http://fplab.blogspot.com/
Дата: 20.06.12 08:02
Оценка:

Здравствуйте, RomikT, Вы писали:

RT>Здравствуйте, fplab, Вы писали:

F>>и все работает. Но терзают смутные сомнения: неужели для того, чтобы изменить значение, соответствующее ключу, надо перебирать всю коллекцию? А если в ней несколько сотен тысяч ключей? Как можно быстрее «выйти» на заданный ключ?

RT>

RT>variableDictionary.put(key, value); RT>

RT>?

RT>А ваш код работать будет через раз потому что вы строки на == сравниваете.

За указание на «= o m»> Приходиться заниматься гадостью — зарабатывать на жизнь честным трудом (Б.Шоу)

Re: Перебор коллекции для изменения

От: zubr
Дата: 20.06.12 08:06
Оценка:

Здравствуйте, fplab, Вы писали:

F>Всем доброго дня!

F>Есть такой код
.
F>и все работает. Но терзают смутные сомнения: неужели для того, чтобы изменить значение, соответствующее ключу, надо перебирать всю коллекцию? А если в ней несколько сотен тысяч ключей? Как можно быстрее «выйти» на заданный ключ?

if (map.containsKey(key))

можно вот так. или я не понимаю.

Re: Перебор коллекции для изменения

От: DrDred
Дата: 20.06.12 08:42
Оценка: +1

Здравствуйте, fplab, Вы писали:

F>Всем доброго дня!

F>Есть такой код

F>Сделано согласно туториалу (Java 7):
F>

F>With the entrySet view, it is also possible to change the value associated with a key by calling a Map.Entry’s setValue method during iteration (again, assuming the Map supports value modification to begin with). Note that these are the only safe ways to modify a Map during iteration; the behavior is unspecified if the underlying Map is modified in any other way while the iteration is in progress.

F>и все работает. Но терзают смутные сомнения: неужели для того, чтобы изменить значение, соответствующее ключу, надо перебирать всю коллекцию? А если в ней несколько сотен тысяч ключей? Как можно быстрее «выйти» на заданный ключ?

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

—
WBR, Alexander
Re[3]: Перебор коллекции для изменения

От: RomikT
Дата: 20.06.12 08:44
Оценка:

Здравствуйте, fplab, Вы писали:

F>А put не сработает. Если ключ key существует, то заменить его не получится

Работает, работает. Вы как-то неправильно проверяете.

Re[3]: Смеетесь или издеваетесь?

От: Skipy http://www.skipy.ru
Дата: 20.06.12 13:38
Оценка:

Здравствуйте, fplab, Вы писали:

F>А put не сработает. Если ключ key существует, то заменить его не получится

Конкретно — описание возвращаемого put значения:

Returns:
the previous value associated with key, or null if there was no mapping for key.

Если значение уже было — оно возвращается. Если не было — возвращается null. Это описание означает, что предыдущее значение может быть.

Ну и в конце концов — проверьте на практике!

package ru.skipy.tests; import java.util.Map; import java.util.TreeMap; /** * MapTest * * @author Eugene Matyushkin aka Skipy * @since 20.06.12 */ public class MapTest < public static void main(String[] args) < Mapmap = new TreeMap<>(); map.put("key", "old value"); System.out.println(map); map.put("key", "new value"); System.out.println(map); > >

С уважением,
Евгений aka Skipy
www.skipy.ru
Re: Перебор коллекции для изменения

От: ResidentR6
Дата: 21.06.12 00:36
Оценка:

Map всего лишь интерфейс, он НИЧЕГО не делает!
TreeMap — сортированная реализация! В большинстве случаев эффективен
HashMap, практически всегда когда ключ — число или строка.

Откройте исходники Java и посмотрите реализацию если любопытно. Если
хотите сделать бенчмарк, скормите ему Войну и мир пословно,
удостоверьтесь в скорости HashMap.

Простой рецепт: используйте HashMap всегда.

Posted via RSDN NNTP Server 2.1 beta
Re[3]: Перебор коллекции для изменения

От: Eugeny__
Дата: 21.06.12 17:40
Оценка:

Здравствуйте, fplab, Вы писали:

RT>>variableDictionary.put(key, value); RT>>

RT>>?

RT>>А ваш код работать будет через раз потому что вы строки на == сравниваете.

F>За указание на «= o m»> Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.

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

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