I am checking if ArrayList contains object:
List<Property> propertiesByName = getPropertiesByCategory(propertyCategory);
for(Property property: propertiesByName){
List<Property> propertyList = getVariationItem().getProperties();
Galgo.log("*******************");
Galgo.log(propertyList.toString());
Galgo.log(property.toString());
Galgo.log("contains:"+propertyList.contains(property));
}
I am getting following log:
*******************
[Property{name='color', value='red'}, Property{name='size', value='42'}]
Property{name='color', value='red'}
contains:false
*******************
[Property{name='color', value='red'}, Property{name='size', value='42'}]
Property{name='color', value='blue'}
contains:false
Database: get 2 variations
*******************
[Property{name='color', value='red'}, Property{name='size', value='42'}]
Property{name='size', value='42'}
contains:false
*******************
[Property{name='color', value='red'}, Property{name='size', value='42'}]
Property{name='size', value='34'}
contains:false
As you can see in the first and third cases, it should return true. What is wrong?
Other parts of my code. First method to get properties by category(color, size). Second method is to get all available properties:
private List<Property> getPropertiesByCategory(String category){
List<Property> properties = new ArrayList<>();
for(Property property: getAllProperties()){
if(property.getName().equals(category)){
if(!properties.contains(property)){
properties.add(property);
}
}
}
return properties;
}
private List<Property> getAllProperties() {
List<Property> propertyList = new ArrayList<>();
for(VariationItem variationItem: getProductItem().getVariationsList()){
for(Property property: variationItem.getProperties()){
if(!propertyList.contains(property))
{
propertyList.add(property);
}
}
}
return propertyList;
}
To use
contains
method, you have to overrideequals()
andhashCode()
methods to achieve this. You can check this answer for implementation https://stackoverflow.com/a/16069158/1320616. Actuallycontains()
will compare two objects. And to compare two objects you have to implementequals()
method.Edit : Here are the full details
So when you use contains() what it is doing is
and if you don't implement equals() method in your class it will take the
equals()
method from the Object class which isSo now it reduces to == is being used between two objects to compare them. When you put == between two objects, it compares on basis of two things (a) hashcodes of two objects (b) It uses
toString()
of the two objects.Each object has different hashcodes assigned to them. this is the reason why your
contains()
is not giving you correct results.you can check as String like this: