tipos - Comprobación y eliminación de elementos en Java HashMap
obtener elemento collection java (2)
Estoy tratando de verificar y eliminar elementos, usando un HashMap en Java. Sus claves son un tipo que he creado llamado ClusterKey, y sus valores son un tipo que he creado llamado ClusterValue.
Aquí está el código que está causando problemas:
ClusterKey ck = new ClusterKey(Long.parseLong(split[0].split("=")[1]),
Integer.parseInt(split[1].split("ey")[1]));
if (arg == 0) keys.put(ck, new ClusterValue(index, false));
if (arg == 1) {
if (keys.containsKey(ck)) {
index = keys.get(ck).messageNo;
keys.remove(ck);
}
keys.put(ck, new ClusterValue(index, true));
}
El problema es que incluso cuando la ClusterKey es la misma que una ClusterKey existente, containsKey () y remove () no parecen reconocerla como igual. He implementado equals () en la clase ClusterKey para reemplazar el método de equals () de Java, de la siguiente manera:
class ClusterKey {
long firstKey;
int secondKey;
public ClusterKey(long firstKey, int secondKey) {
this.firstKey = firstKey;
this.secondKey = secondKey;
} public boolean equals(Object otherKey) {
return this.firstKey == ((ClusterKey) otherKey).firstKey && this.secondKey == ((ClusterKey) otherKey).secondKey;
}
}
Entonces, estoy bastante confundido. Muchas gracias por su ayuda.
Saludos, Rebecca
ACTUALIZACIÓN: Gracias por sus consejos y comentarios sobre mi código. Pude resolver el problema agregando hashCode () a ClusterKey, de la siguiente manera:
} public boolean equals(Object otherKey) {
return this.firstKey == ((ClusterKey) otherKey).firstKey && this.secondKey == ((ClusterKey) otherKey).secondKey;
} public int hashCode() {
return (int) firstKey + secondKey;
}
Para que cualquier estructura de datos Hash habilitada (como HashMap
, HashSet
) funcione correctamente, sus elementos deben anular hashCode()
además del método equals()
. La razón es que el código hash se usa para identificar el segmento en el que colocar el elemento (durante la inserción) o buscar (usando equals()
durante una búsqueda).
Si no anula hashCode()
, se utiliza la implementación predeterminada de Object#hashCode()
que devolvería valores diferentes incluso para los objetos que considere equivalentes (el método equals()
devuelve true para).
Es por eso que tu
hashMap.containsKey(ClusterKey key)
las llamadas fallan a pesar de que la clave ya está presente. Como los códigos hash no coinciden, HashMap
nunca busca la clave en el cubo correcto. Por lo tanto, nunca se llama a tus equals()
aquí.
Tendrá que implementar hashCode()
, no solo equals
, para que su ClusterKey
funcione bien como una clave en un HashMap
.
Específicamente, citando de los Javadocs vinculados:
Si dos objetos son iguales de acuerdo con el método equals (Object), entonces llamar al método hashCode en cada uno de los dos objetos debe producir el mismo resultado entero.