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.