2016-02-13 127 views
-4

我检查,如果ArrayList包含的对象:Java。 ArrayList中的contains方法不工作

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

我得到以下日志:

******************* 
[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 

正如你可以在第一和第三种情况看,它应返回true 。哪里不对?

我的代码的其他部分。第一种按类别(颜色,大小)获取属性的方法。第二种方法是让所有可用的属性:

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

回答

2

要使用contains方法,你必须覆盖equals()hashCode()方法来实现这一目标。你可以检查这个答案执行https://stackoverflow.com/a/16069158/1320616。其实会比较两个对象。并且要比较两个对象,您必须执行equals()方法。

编辑:以下是完整细节

因此,当您使用含有()它是什么做的是

@Override public boolean contains(Object object) { 
     Object[] a = array; 
     int s = size; 
     if (object != null) { 
      for (int i = 0; i < s; i++) { 
       if (object.equals(a[i])) { 
        return true; 
       } 
      } 
     } else { 
      for (int i = 0; i < s; i++) { 
       if (a[i] == null) { 
        return true; 
       } 
      } 
     } 
     return false; 
    } 

,如果你没有在你的类实现equals()方法,它会采取从对象类,这是

public boolean equals(Object o) { 
     return this == o; 
} 

所以,现在它减少到==被两个对象之间使用对它们进行比较的方法equals()。当您在两个对象之间放置==时,它会根据两件事情进行比较(a)两个对象的哈希码(b)它使用两个对象的toString()

每个对象都有不同的哈希码分配给它们。这就是为什么你的没有给你正确的结果。

+0

可以显示一个例子,请 –

+0

检查这个例子http://javapapers.com/core-java/hashcode-and-equals-methods-override/ –

0

,您可以检查的字符串是这样的:

Galgo.log("contains:"+propertyList.toString().contains(property.toString()));