Допустим, у меня есть хэш-карта.
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"?
Помощь очень ценится.
Мне задали тот же вопрос, и я ответил тем же ответом, что это невозможно, поскольку значение перезаписывается. Но интервьюер сказал, что нет способа получить предыдущее значение.
Используйте результат, возвращенный put. Если это null, то с этим ключом ничего не сопоставлено. Если результат не равен нулю, у вас есть предыдущее значение, связанное с ключом.
Почему в вашем примере есть начальные операторы putдва, то есть hm.put("A","First"); hm.put("B","First");? Есть ли какая-то связь между этими двумя отображениями и желанием получить в результате "First"? Вы хотите получить его, потому что "A" ранее был сопоставлен с ним или потому что "B" был связан с ним до hm.put("A","Second");? Или все это вопрос с подвохом насчет фактического значения слова «предыдущий»?




Насколько я знаю, это можно сделать двумя способами:
Проверьте, возвращает ли значение, возвращаемое старым 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");
}
Мы знаем, что метод 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");
Спасибо за ваш ответ, но я хочу знать, можем ли мы получить предыдущее значение, которое в настоящее время изменено, или нет, поскольку кто-то сказал мне, что есть способ получить предыдущее значение. Моя беда в том, что у меня не было возможности спросить его, как. :(
В любом случае, hmap.get("A") дает мне "First" после переделки (hm.put("A","Second");)
Ага. В приведенном выше ответе вы получаете предыдущее значение, то есть First, а затем оно заменяется на Second. Предлагаю вам попробовать.
Пожалуйста, сосредоточьтесь! Я говорю «после переделки», а не «до».
Тогда вы можете попробовать String oldValue = hmap.put("A", "Second");. Таким образом, после внесения изменений вы получите предыдущее значение.
Вот как я это сделаю - либо заявление println, как упомянуто, либо, возможно, сохраните его где-нибудь в другом List и т. д. Итак, +1 от меня.
Нет, однако вы можете использовать список в качестве значения. Так получается:
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.
Значение перезаписывается. Получить предыдущее значение невозможно. Вам нужно будет реализовать свою собственную логику, чтобы уловить это.