0

データベース ダンプを xml および *.sql と比較したいと考えています。debagge ではtoRemovetoAdd寸法のみが異なります。toRemoveのサイズは 3 で、toAddサイズは 4 です。しかし、コードを実行するとremoveAll、のtoRemoveサイズは 3 になり、toAddサイズは 4 になります。何が問題なのですか?

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

1 に答える 1

1

HashSet(さらに言えば)を適切に使用するには、次の契約に従ってHashMapを実装する必要があります。hashCode()

  • Java アプリケーションの実行中に同じオブジェクトに対して複数回呼び出された場合は常に、オブジェクトの equals 比較で使用される情報が変更されていない限り、hashCode メソッドは一貫して同じ整数を返す必要があります。この整数は、あるアプリケーションの実行から同じアプリケーションの別の実行まで一貫性を保つ必要はありません。
  • equals(Object) メソッドに従って 2 つのオブジェクトが等しい場合、2 つのオブジェクトのそれぞれで hashCode メソッドを呼び出すと、同じ整数結果が生成される必要があります。
  • equals(java.lang.Object) メソッドに従って 2 つのオブジェクトが等しくない場合、2 つのオブジェクトのそれぞれで 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;
}
于 2013-10-08T06:17:57.083 に答える