mapas multi-clave
Los
mapas utilizan un sólo objeto como clave. Cuando se quieren usar varios objetos
como clave, es necesario crear un objeto que contenga los diferentes elementos
de la clave, cuidando de redefinir los métodos equals() y hashCode() para
obtener los resultados deseados.
Ejemplo.
Queremos
guardar objetos asociados a 2 claves: las coordenadas X-Y en un plano. No
podemos usar un array bidimensional bien porque las coordenadas no están
acotadas (y el array sería demasiado grande), bien porque la tabla es poco
densa (la mayor parte de las posiciones están vacías y el array estaría
mayormente desperdiciado con celdas null).
En
estos casos recurrimos a crear objetos que engloben la X y la Y:
clave combinada: class Punto |
public class Punto { private final int x, y; public Punto(int x, int y) { this.x = x; this.y = y; } @Override public boolean equals(Object
o) { if (this == o) return
true; if (o == null) return
false; if (!(o instanceof
Punto)) return false; Punto punto = (Punto) o; return x == punto.x
&& y == punto.y; } @Override public int hashCode() { return 31 * x + y; } } |
Y
ahora podemos usar estas claves para acceder al mapa:
tabla multiclave |
public class SparseTable { private final Map<Punto,
Object> map = new
HashMap<Punto, Object>(); public void put(int x, int
y, Object o) { map.put(new Punto(x, y), o); } public Object get(int x, int
y) { return map.get(new
Punto(x, y)); } } |
El
método es fácilmente generalizable a cualquier conjunto de datos que queramos
usar como clave de acceso, sin más que envolverlo en la clave combinada
correspondiente.
Temas relacionados
24. Map<K, V> (interface) java.util.Map<K, V>