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:
- GreenBroot EventBus no pudo enviar el evento
- Carga dibujable desde la tarjeta sd
- Java.lang.illegalStateException se produce al azar al obtener mediaPlayer.getCurrentPosition
- Android import java.nio.file.Files; no se puede resolver
- ¿Por qué Android tiene su propia implementación de URI y no utiliza la implementación de Java por defecto?
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.
- Android NullpointerException al intentar recuperar datos de SQLiteOpenHelper
- Cómo mantener un archivo jar externo, pero todavía uso de sus clases en mi proyecto de Android?
- ¿Cómo XOR los valores de píxeles de dos mapas de bits juntos?
- Pasando de la programación de Java a Android Application Developement
- Android: cómo cambiar el diseño en el botón de clic?
- Seguridad de los recursos de la cadena
- Código demasiado grande y demasiados errores constantes (Android Studio)
- La restricción UNIQUE falló: base de datos sqlite: android
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.
- Dirección del elemento de derecha a izquierda en android con más de 4,2
- ¿Puede depurar PhoneGap usando Eclipse?