Обновление: Мой предыдущий ответ был неверным.Вы не можете сделать это без изменения поведения по умолчанию!Смотрите ниже, почему.
.. как получить последнюю введенную запись или введенный ключ?
Из описания API LinkedHashMap
вы можете прочитать:
Структурная модификация - это любая операция, которая добавляет или удаляет одно или несколько отображений или, в случае упорядоченных по доступу связанных хеш-карт, влияет на порядок итераций.В упорядоченных по вставке связанных хэш-картах простое изменение значения, связанного с ключом, который уже содержится в карте, не является структурной модификацией .В упорядоченных по доступу связанных хеш-картах простой запрос карты с помощью get является структурной модификацией .
Так что же все это значит?
- access-order - каждый раз, когда вы делаете
put
или get
, порядок элементов меняется - заказ на вставку - при вставке элементов (впервые) они добавляются последними
Например:
map.put(1, 1);
map.put(2, 2);
map.put(1, 10);
System.out.println(map);
...напечатает {1=10, 2=2}
с с указанием вставки и {2=2, 1=10}
с * с указанием доступа '.Проблема заключается в использовании access-ordered
, если, конечно, если вы выполняете операции get
, порядок также меняется.
Как исправить
Итак ... как исправить.Ну, LinkedHashMap
нельзя использовать напрямую.Таким образом, вы можете обернуть его (не обращая внимания на банальное имя) и переопределить методы put
и putAll
, чтобы они сначала удаляли ключ с карты, а затем возвращали его обратно!
class BestLinkedHashMap<K, V> extends LinkedHashMap<K, V> {
@Override
public V put(K key, V value) {
V last = super.remove(key);
super.put(key, value);
return last;
}
@Override
public void putAll(Map<? extends K, ? extends V> m) {
for (K key : m.keySet())
super.remove(key);
super.putAll(m);
}
}
Затем, чтобы получить последний элемент, выполните:
, оберните вывод из реализации LinkedList
:
V v = new LinkedList<V>(map.values()).getLast();
toArray()
way:
Collection<V> values = map.values();
V v = values.toArray(new V[0])[values.size() - 1];
итерация до последнего элемента с использованием итератора:
Iterator<V> it = values.iterator();
V last = null;
while (it.hasNext())
last = it.next();