utilizan tipos que principales por para ofrecidas obtener objetos objeto metodos las elemento describa conclusion collection colecciones clases almacenamiento java hashmap

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.