Можно ли получить предыдущее сохраненное значение в Hashmap?

Допустим, у меня есть хэш-карта. HashMap<String,String> hm = new HashMap<String,String>(); Теперь я ввел несколько значений в эту карту, как показано ниже. hm.put("A","First"); hm.put("B","First");

После этого я снова ввел некоторые значения для уже сохраненного ключа «A».

hm.put("A","Second");

Теперь, если я попытаюсь получить значение «A», я получу «Second» в качестве его значения.

sysout(hm.get("A"));

Вывод Second

Есть ли способ получить предыдущее значение, например, "First"?

Помощь очень ценится.

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

Aditya Narayan Dixit 04.12.2018 13:48

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

naggarwal11 04.12.2018 13:51

Используйте результат, возвращенный put. Если это null, то с этим ключом ничего не сопоставлено. Если результат не равен нулю, у вас есть предыдущее значение, связанное с ключом.

fps 04.12.2018 17:02

Почему в вашем примере есть начальные операторы putдва, то есть hm.put("A","First"); hm.put("B","First");? Есть ли какая-то связь между этими двумя отображениями и желанием получить в результате "First"? Вы хотите получить его, потому что "A" ранее был сопоставлен с ним или потому что "B" был связан с ним до hm.put("A","Second");? Или все это вопрос с подвохом насчет фактического значения слова «предыдущий»?

Holger 05.12.2018 15:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
1 641
5

Ответы 5

Насколько я знаю, это можно сделать двумя способами:

  1. Проверьте, возвращает ли значение, возвращаемое старым key, значение (т.е. null или нет). Теперь вы можете зафиксировать это значение до положить новое значение для указанного ключа.

    Иллюстрация:

    HashMap<String, String> hmap = new HashMap<>();     
    hmap.put("A", "First");
    
    if (hmap.get("A") != null) {        
        String oldValue = hmap.get("A");        
        hmap.put("A", "Second");    
    }
    
  2. Мы знаем, что метод put() возвращает значение предыдущего ключ

    Associates the specified value with the specified key in this map. If the map previously contained a mapping for the key, the old value is replaced.

    @return the previous value associated with key

    Итак, вы могли:

    String oldValue = hmap.put("A", "Second");
    

Спасибо за ваш ответ, но я хочу знать, можем ли мы получить предыдущее значение, которое в настоящее время изменено, или нет, поскольку кто-то сказал мне, что есть способ получить предыдущее значение. Моя беда в том, что у меня не было возможности спросить его, как. :(

naggarwal11 04.12.2018 13:54
получить предыдущее значение, которое в настоящее время изменено - Что ты имеешь в виду?
Nicholas K 04.12.2018 13:55

В любом случае, hmap.get("A") дает мне "First" после переделки (hm.put("A","Second");)

naggarwal11 04.12.2018 13:57

Ага. В приведенном выше ответе вы получаете предыдущее значение, то есть First, а затем оно заменяется на Second. Предлагаю вам попробовать.

Nicholas K 04.12.2018 13:59

Пожалуйста, сосредоточьтесь! Я говорю «после переделки», а не «до».

naggarwal11 04.12.2018 14:00

Тогда вы можете попробовать String oldValue = hmap.put("A", "Second");. Таким образом, после внесения изменений вы получите предыдущее значение.

Nicholas K 04.12.2018 14:04

Вот как я это сделаю - либо заявление println, как упомянуто, либо, возможно, сохраните его где-нибудь в другом List и т. д. Итак, +1 от меня.

achAmháin 04.12.2018 14:05

Нет, однако вы можете использовать список в качестве значения. Так получается:

Map<String, List<String>> map = ...;

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

map.get(key).add(value);

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

List<String> list = map.get(key);
String value = list.get(list.size()-1);

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

hm.put("A","First");
String temp = hm.put("A","Second");
System.out.println(temp); // prints first

Карта нормалей не работает. В карте нормалей старое значение перезаписывается и исчезает.

Однако существует структура данных, подобная карте, которая сохраняет набор значений, которые были помещены в карту: мульти-карта.

Пример:

ListMultimap<String, String> m = ArrayListMultimap.create();

m.put("A", "First");
m.put("A", "Second");

for (String s : m.get("A")) {
    System.out.println(s);
}

// Prints:
// First
// Second

Мульти-карты очень удобны для работы во многих ситуациях, и о них стоит изучить.

В примере кода здесь используется мульти-карта из библиотеки Guava. Его можно скачать с Репозиторий Maven.

Что ж, есть много возможностей для этого, вопрос в том, насколько глубоко вы хотите сохранить значения. Вам также нужно первое значение после 10 операций put? Вам нужно это отсортировать?

Вы можете добиться этого без сортировки с помощью HashTable, см. Java HashTable: https://docs.oracle.com/javase/8/docs/api/java/util/Hashtable.html

Hashtable<Key, Element> table;

Сортированный способ может быть с использованием стека или чего-то еще:

HashMap <Key,Stack<Element>> values;

https://docs.oracle.com/javase/7/docs/api/java/util/Stack.html

Итак, вы можете получить доступ к первому элементу, подобному этому

values.get("A").peek();

Если вам нужно получить доступ к случайным элементам в стеке, используйте для этого LinkedList:

HashMap<Key,LinkedList<Element>> values;
values.get("A").getFirst();
values.get("A").getLast();

Убедитесь, что вы всегда переопределяете методы hashCode () и equals (), если вы используете что-то вроде HashMap.

Другие вопросы по теме