Hashmap con dos claves o una clave compuesta en Java

Un Hashmap es una estructura usada en Java para almacenar pares de clave-valor. Hereda de Map y se suele utilizar a modo de diccionario. De esta manera, para cada clave se le asigna un valor, el cual se puede consultar con al método get del Hashmap. Pero en la práctica, podemos encontrarnos con la necesidad de que la clave esté compuesta por dos claves, es decir, sea una clave compuesta.

En una Hashmap Java, cada clave sólo aparece una vez y en caso de guardar una clave que ya exista, se sobreescribe. Y las claves se ordenan según decida la máquina virtual para hacer más eficiente su búsqueda. Se guarda una nueva clave con el método put(clave, valor) y se recupera con get(clave).

Pero, ¿qué pasa si la clave está compuesta por dos claves o valores? Por ejemplo, si necesitamos que la clave sea país-ciudad. Esto no lo soporta el Hashmap de serie, pero hay una solución alternativa.

La solución sería crear una nueva clase que contenga el par de valores que harán de clave. Además, habrá que definir una función que obtenga su hashCode, que es lo que hace que las búsquedas sean rápidas y eficientes. También habrá que definir la manera de comparar las claves, para poder ordenarlas de forma eficiente. Con todo esto, esta nueva clase podría quedar así.

public class Key {

    private final String x;
    private final String y;

    public Key(String x, String y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Key)) return false;
        Key key = (Key) o;
        return x.equalsIgnoreCase(key.x) && y.equalsIgnoreCase(key.y);
    }

    @Override
    public int hashCode() {
        return (x + y).hashCode();
    }

}

Usando esta clase, para rellenar el hashMap, podemos hacerlo de la siguiente manera.

miHashMap.getMap().put(new Key(rs.getString("clave1"), rs.getString("clave2")),"valor");

Y para consultar un valor, tan fácil como esto.

miHashMap.getMap().getMap().containsKey(new Key(currencyAlfaCodeFrom, currencyAlfaCodeTo))

Deja un comentario

Pin It on Pinterest