Recientemente tuve una entrevista donde el entrevistador me pidió que crear una HashMap
que tiene un máximo de 7 pares clave / valor. Si se añade un par de claves / valor octavo, el par primero de clave / valor debe ser retirado y la octava insertado para reemplazarlo, etc.
¿Qué es una buena estrategia para resolver este problema?
Hacer una estructura de datos utilizando LinkedHashMap y anular removeEldestEntry es decir algo como esto:
import java.util.LinkedHashMap;
class CustomHashMap extends LinkedHashMap<Integer, Integer> {
private int capacity;
public CustomHashMap(int capacity) {
super(capacity, 0.75F, true);
this.capacity = capacity;
}
public int get(int key) {
return super.getOrDefault(key, -1);
}
public void put(int key, int value) {
super.put(key, value);
}
@Override
protected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {
return size() > capacity;
}
}
Alternativamente, si no se le permite utilizar las bibliotecas estándar o si está utilizando un lenguaje que no tiene una ordenada diccionario estructura como Java / Python se puede utilizar un Hashtable
+ y una DoubleEndedLinkedList
que puede definir usted mismo y lograr lo mismo o utilizar un Deque
:
- Complejidad del tiempo:
O(1)
por tanto PUT y GET. - La complejidad de las instalaciones:
O(capacity)
.
A pesar de que usted tiene que escribir un código mucho más.
Versión genérica según @Holger solicitud 's :
import java.util.LinkedHashMap;
import java.util.Map;
class CustomHashMap<K, V> extends LinkedHashMap<K, V> {
private int capacity;
public CustomHashMap(int capacity) {
super(capacity, 0.75F, true);
this.capacity = capacity;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > capacity;
}
}
Ejemplo de Uso:
class Main {
public static void main(String[] args) {
CustomHashMap map = new CustomHashMap(3);
map.put(1, null);
map.put(2, null);
map.put(3, null);
map.put(4, null);
System.out.println(map.keySet());
}
}
Salida:
[2, 3, 4]