Re: LinkedHashMap - get latest key?
Andreas Leitgeb <avl@auth.logic.tuwien.ac.at> wrote:
Given a LinkedHashMap instance, what would be a
reasonable way to obtain the latest added key?
The specific definition of "reasonable" being:
- no separate keeping track of key-sequence
- it should be a O(1) operation, and not
have to iterate all keys.
If you don't have to remove objects from the map, or you can live with
remove being O( n ) when it's the latest added element that's removed,
you can just subclass LinkedHashMap like below. (Warning: the code
hasn't been tested, just written. Caveat emptor.)
If you frequently pop the most recently added element from the map,
though, this approach is useless.
public class LinkedHashMapHack<K, V> extends LinkedHashMap<K, V> {
private K mostRecentKey;
private V mostRecentValue;
public Map.Entry<K, V> getMostRecentEntry( Object key ) {
Map.Entry<K, V> mostRecentEntry = new AbstractMap.SimpleImmutableEntry<>( mostRecentKey, mostRecentValue );
return mostRecentEntry;
}
@Override
public void clear() {
super.clear();
mostRecentKey = null;
mostRecentValue = null;
}
@Override
public V put( K key, V value ) {
V previousAtKey = super.put( key, value );
mostRecentKey = key;
mostRecentValue = value;
return previousAtKey;
}
@Override
public V remove( Object key ) {
V removed = super.remove( key );
if( size() == 0 ) {
mostRecentKey = null;
mostRecentValue = null;
} else if( key.equals( mostRecentKey ) ) {
findNewMostRecentKeyAndValue();
}
return removed;
}
private void findNewMostRecentKeyAndValue() {
Map.Entry<K, V> lastEntry = null;
for( Map.Entry<K, V> entry : super.entrySet() ) {
lastEntry = entry;
}
mostRecentKey = lastEntry.getKey();
mostRecentValue = lastEntry.getValue();
}
}
--
Leif Roar Moldskred