HashMap Eliminar no funciona

He leído todas las respuestas sobre este tema y nada parece estar funcionando.

Aquí está el código que estoy ejecutando:

HashMap<TicketItem, ArrayList<TicketItemModifier>> items = new HashMap<TicketItem, ArrayList<TicketItemModifier>>(); for (final TicketItem key : items.keySet()) { Log.i(key.equals(item)); Log.i(key.hashCode() + " " + item.hashCode()); } Log.i(items.size()); Log.i("C: " + items.containsKey(item)); items.remove(item); Log.i("C: " + items.containsKey(item)); Log.i(items.size()); for (final TicketItem key : items.keySet()) { Log.i(key.equals(item)); Log.i(key.hashCode() + " " + item.hashCode()); } 

No puedo proporcionar código de trabajo porque es realmente un proyecto enorme. He seguido adelante e imprimí todo (como se puede ver en mi código de ejemplo) para que sepas que los valores que usa el HashMap son correctos.

Iniciar sesión:

 03-22 18:58:10.125: I/POSDoes(29790): true 03-22 18:58:10.125: I/POSDoes(29790): -823765791 -823765791 03-22 18:58:10.125: I/POSDoes(29790): false 03-22 18:58:10.125: I/POSDoes(29790): 1543283745 -823765791 03-22 18:58:10.125: I/POSDoes(29790): false 03-22 18:58:10.125: I/POSDoes(29790): 427224321 -823765791 03-22 18:58:10.125: I/POSDoes(29790): false 03-22 18:58:10.125: I/POSDoes(29790): -616760351 -823765791 03-22 18:58:10.125: I/POSDoes(29790): 4 03-22 18:58:10.125: I/POSDoes(29790): C: true 03-22 18:58:10.130: I/POSDoes(29790): C: true 03-22 18:58:10.130: I/POSDoes(29790): 4 03-22 18:58:10.130: I/POSDoes(29790): true 03-22 18:58:10.130: I/POSDoes(29790): -823765791 -823765791 03-22 18:58:10.130: I/POSDoes(29790): false 03-22 18:58:10.130: I/POSDoes(29790): 1543283745 -823765791 03-22 18:58:10.130: I/POSDoes(29790): false 03-22 18:58:10.130: I/POSDoes(29790): 427224321 -823765791 03-22 18:58:10.130: I/POSDoes(29790): false 03-22 18:58:10.130: I/POSDoes(29790): -616760351 -823765791 

Como se puede ver, los códigos de hash coinciden, y el método igual devuelve true, pero cuando imprime contiene, estoy recibiendo true antes y después de llamar al método remove. ¿Por qué no funciona esto?

Actualizar

He imprimido item.equals (clave) con el mismo resultado.

 for (final TicketItem key : items.keySet()) { Log.i(item.equals(key)); Log.i(key.equals(item)); Log.i(key.hashCode() + " " + item.hashCode()); } Log.i(items.size()); Log.i("C: " + items.containsKey(item)); items.remove(item); Log.i("C: " + items.containsKey(item)); Log.i(items.size()); for (final TicketItem key : items.keySet()) { Log.i(item.equals(key)); Log.i(key.equals(item)); Log.i(key.hashCode() + " " + item.hashCode()); } 

Iniciar sesión:

 03-22 19:09:14.360: I/POSDoes(30458): true 03-22 19:09:14.360: I/POSDoes(30458): true 03-22 19:09:14.360: I/POSDoes(30458): 1543283745 1543283745 03-22 19:09:14.365: I/POSDoes(30458): false 03-22 19:09:14.365: I/POSDoes(30458): false 03-22 19:09:14.365: I/POSDoes(30458): 427224321 1543283745 03-22 19:09:14.365: I/POSDoes(30458): false 03-22 19:09:14.365: I/POSDoes(30458): false 03-22 19:09:14.365: I/POSDoes(30458): -616760351 1543283745 03-22 19:09:14.365: I/POSDoes(30458): 3 03-22 19:09:14.365: I/POSDoes(30458): C: true 03-22 19:09:14.365: I/POSDoes(30458): C: true 03-22 19:09:14.365: I/POSDoes(30458): 3 03-22 19:09:14.365: I/POSDoes(30458): true 03-22 19:09:14.365: I/POSDoes(30458): true 03-22 19:09:14.365: I/POSDoes(30458): 1543283745 1543283745 03-22 19:09:14.365: I/POSDoes(30458): false 03-22 19:09:14.365: I/POSDoes(30458): false 03-22 19:09:14.365: I/POSDoes(30458): 427224321 1543283745 03-22 19:09:14.370: I/POSDoes(30458): false 03-22 19:09:14.370: I/POSDoes(30458): false 03-22 19:09:14.370: I/POSDoes(30458): -616760351 1543283745 

Actualización 2 Aquí está la implementación de equals ()

 @Override public boolean equals(Object obj) { if (this == obj) return true; if (!super.equals(obj)) return false; if (this.getClass() != obj.getClass()) return false; TicketItem other = (TicketItem) obj; if (!getValues().equals(other.getValues())) return false; return true; } 

GetValues ​​() devuelve un LinkedHashMap con valores arbitrarios (pero iguales!).

Actualización 3

El método de iguales está pasando correctamente (sin problemas). Sin embargo, parece que el código hash está cambiando. Cuando llamo a la función de eliminación, todos los hashes guardados en el mapa hash son iguales. El código de hash que se genera en realidad es sólo un código de hash de LinkedHashMap diferente. Significado de la función hashCode () de TicketItem utiliza la función hashCode () de LinkedHashMap.

Digamos que un elemento se agrega a un HashMap con el tamaño 16. Tiene hashCode = 20. HashMap de Android crea una entrada en el cubo 4, almacenando el hash real (20) y una referencia al propio elemento.

Ahora digamos que el elemento se modifica para que el hashCode se cambie a 36.

Si ahora ejecutamos containsKey () usando la misma referencia de Item, HashMap de Android buscará en el mismo cubo, 4. Allí encuentra la clave basada en la identidad (==). Es el mismo objeto, pero en este momento no se preocupa por el código de hash.

Sin embargo, si ejecutamos remove () usando la misma referencia de Item, el HashMap de Android volverá a aparecer en el cubo 4. Sin embargo, este código no realiza la comprobación de identidad (==) – comprueba el hashCode calculado y equals (). Pero dado que el hashCode calculado ha cambiado (20 vs 36), la eliminación falla.

Por lo tanto, para resumir: El hashCode ha cambiado desde que el objeto fue agregado y el nuevo código hash pasa a asignar al mismo cubo.

(Tenga en cuenta que me parece que esta cola colisión improbable yo, sobre todo teniendo en cuenta que la implementación de algunas operaciones de bits mágicos para proteger de los algoritmos de hashing pobres. Puede haber otras explicaciones, pero este es el único que me parece lógico basado en los hallazgos hasta el momento.

  • Cómo cambiar las pestañas de forma programática mediante buttonclick en Android
  • Elementos de menú de la bandeja de navegación seleccionados dentro de diferentes grupos
  • Google mapa cuestión incluso todos los ajustes son correctos según google doc
  • ¿Cómo evitar que ProgressDialog descarte el cambio de rotación de la pantalla en Android?
  • Androide. Cambio de brillo
  • No se puede resolver el símbolo JSONParser
  • Cómo compartir el diseño IDE en IntelliJ IDEA?
  • Cómo obtener el modo de permiso de archivo mediante programación en Java
  • Cómo ocultar los números de la semana en CalendarView (DatePicker)
  • DexIndexOverflowException Con la API de Google Maps
  • Cómo hacer anotaciones como destacar, tachar, subrayar, dibujar, añadir texto, etc en android para un visor de pdf?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.