I\'m having a problem with getting an ArrayList to correctly use an overriden equals. the problem is that I\'m trying to use the equals to only test for a single key field, and
Generally, you need to also override hashCode()
but this is not the main problem here. You are having an asymmetric equals(..)
method. The docs make it clear that it should be symmetric:
It is symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true.
And what you observe is an unexpected behaviour due to broken contract.
Create an utility method that iterates all items and verifies with equals(..)
on the string:
public static boolean containsString(List items, String str) {
for (InnerClass item : items) {
if (item.getTestKey().equals(str)) {
return true;
}
}
return false;
}
You can do a similar thing with guava's Iterables.any(..)
method:
final String str = "Foo";
boolean contains = Iterables.any(items, new Predicate() {
@Override
public boolean apply(InnerClass input){
return input.getTestKey().equals(str);
}
}