2016-02-13 64 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()));