HashMap Remove does not work

I read all the answers on this question and nothing works.

Here is the code I'm running:

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());
        }

I cannot provide working code because it is a really huge project. I went ahead and printed everything (as you can see in my code example) so that you know that the values ​​used by the HashMap are correct.

Log:

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

As you can see, the hash codes are the same, and the equals method returns true, but when printing contains, I get true before and after the remove method is called. Why is this not working?

Update

I printed item.equals (key) with the same result.

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());
        }

Log:

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

Update 2 Here is an implementation for 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 ​​() returns a LinkedHashMap with arbitrary (but equal!) values.

Update 3

equals ( ). , - . remove, , -, . - - LinkedHashMap. hashCode() TicketItem hashCode() LinkedHashMap.

+4
1

, HashMap 16. hashCode = 20. Android HashMap 4, (20) .

, , hashCode 36.

containsKey(), , Android HashMap , 4. , (==). , -.

, , remove(), , Android HashMap 4. (==) - - equals(). - (20 36), .

, : hashCode , - - .

( , , , , . , , .)

+4

Source: https://habr.com/ru/post/1533015/


All Articles