2013-10-03 65 views
0

我想比較數據庫轉儲到xml和* .sql。在debagge toRemovetoAdd僅在尺寸上有所不同。 toRemove的大小爲3,toAdd的大小爲4.但是在運行代碼後,removeAll,toRemove的大小爲3,toAdd的大小爲4.出現了什麼問題?removeAll from Interface Set

final DBHashSet fromdb = new DBHashSet(strURL, strUser, strPassword); 
final DBHashSet fromxml = new DBHashSet(namefile); 

Set<DBRecord> toRemove = new HashSet<DBRecord>(fromdb); 
toRemove.removeAll(fromxml); 

Set<DBRecord> toAdd = new HashSet<DBRecord>(fromxml); 
toAdd.removeAll(fromdb); 

更新:

public class DBRecord { 
    public String depcode; 
    public String depjob; 
    public String description; 

    public DBRecord(String newdepcode, String newdepjobe, String newdesc) { 
     this.depcode = newdepcode; 
     this.depjob = newdepjobe; 
     this.description = newdesc; 
    } 

    public String getKey() { 
     return depcode + depjob; 
    } 

    public boolean IsEqualsKey(DBRecord rec) { 
     return (this.getKey().equals(rec.getKey())); 
    } 

    public boolean equals(Object o) { 
     if (o == this) 
      return true; 
     if (o == null) 
      return false; 
     if (!(getClass() == o.getClass())) 
      return false; 
     else { 
      DBRecord rec = (DBRecord) o; 
      if ((rec.depcode.equals(this.depcode)) && (rec.depjob.equals(this.depjob))) 
       return true; 
      else 
       return false; 
     } 
    } 
} 
+4

檢查您的'hashCode'和'equals()'實現。 –

+0

我們可以看到你的DBRecord類嗎? – Marcelo

+0

帶有DBrecord類的更新文章 – user1755546

回答

1

爲了正確使用HashSet(和HashMap,對於這個問題),您必須實現一個hashCode()爲每following contract

  • 只要它是在執行Java應用程序期間多次調用同一對象時,hashCode方法必須始終返回相同的整數,提供d沒有在對象的等號比較中使用的信息被修改。該整數不需要從應用程序的一次執行到同一應用程序的另一次執行保持一致。
  • 如果兩個對象根據equals(Object)方法相等,則對這兩個對象中的每個對象調用hashCode方法必須產生相同的整數結果。
  • 根據equals(java.lang.Object)方法,如果兩個對象不相等,則不要求對兩個對象中的每個對象調用hashCode方法必須產生不同的整數結果。但是,程序員應該意識到,爲不相等的對象生成不同的整數結果可能會提高散列表的性能。

您爲DBRecord提供的代碼並未覆蓋它,因此存在問題。 您可能想要按照以下方式覆蓋它:

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + depcode.hashCode(); 
    result = prime * result + depjob.hashCode()); 
    return result; 
}