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>