0

オブジェクトの等価性から得られる結果を理解しようとしています...まず、db の 2 つの 2 つのテーブルから重複オブジェクトをフィルタリングする必要がある問題について説明しましょう (Hibenate すべての cluse が設定されています) プリセット条件は、firstName、lastName、dateOfbirth です

package com.equality.types;  

import com.google.common.base.Objects;  

import java.util.Date;  

public class AsignoreTypes{  
private String firstname;  
private String lastname;  
private Date doa;  

public String getFirstname() {  
    return firstname;  
}  

public void setFirstname(String firstname) {  
    this.firstname = firstname;  
}  

public String getLastname() {  
    return lastname;  
}  

public void setLastname(String lastname) {  
    this.lastname = lastname;  
}  

public Date getDoa() {  
    return doa;  
}  

public void setDoa(Date doa) {  
    this.doa = doa;  
}  


/*   @Override 
public boolean equals(Object obj) { 
    if (obj instanceof AsignoreTypes == false) { 
        return false; 
    } 

    if (this == obj) { 
        return true; 
    } 
    AsignoreTypes other = (AsignoreTypes) obj; 
    return new EqualsBuilder().append(this.firstname , other.firstname) 
            .append(this.lastname, other.lastname) 
            .append(this.doa , other.doa).isEquals(); 
} 

@Override 
public int hashCode() { 
    return new HashCodeBuilder().append(this.firstname) 
            .append(this.lastname) 
            .append(this.doa) 
            .hashCode(); 
} 
 */  
@Override  
public int hashCode(){  
    return Objects.hashCode(firstname, lastname, doa);  
}  

@Override  
public boolean equals(final Object obj){  
    if(obj instanceof AsignoreTypes){  
        final AsignoreTypes other = (AsignoreTypes) obj;  
           return Objects.equal(firstname, other.firstname)  
                &&Objects.equal(lastname, other.lastname)  
                && Objects.equal(doa, other.doa);  
    } else{  
        return false;  
    }  
}  

したがって、私のサービス クラスでは、2 つのテーブルに対して Query を呼び出し、オブジェクト リストを作成します。

リストの 1 つで、2 番目のリストにネストされた反復を作成します

したがって、私のサービス クラスでは、2 つのテーブルに対して Query を呼び出し、カスタム リストを作成します。リストとオブジェクトを反復処理します。

したがって、私のサービス クラスでは、2 つのテーブルに対して Query を呼び出し、カスタム リストを作成します。リストとオブジェクトを反復処理します。

Session session = service.getDataServiceManager().getSession();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Query query = session.createQuery("select upper(ass.firstName), upper(ass.lastName), ass.doa from AssignorInfo ass");
List < Object > ass1 = null;
ass1 = query.list();
List < AsignoreTypes > res1 = null;
res1 = new ArrayList < AsignoreTypes > ();
Iterator < Object > it = ass1.iterator();
while (it.hasNext()) {
        Object[] row = (Object[]) it.next();
AsignoreTypes ass = new AsignoreTypes();
if (row[0] != null) ass.setFirstname(row[0].toString());
if (row[1] != null) ass.setLastname(row[1].toString());
if (row[2] != null) ass.setDoa(formatter.parse(row[2].toString()));
res1.add(ass);
}
        log(INFO, "List one size " + res1.size());
Query q = session.createQuery("select upper(g.fname), upper(g.lname), g.doa from  GeneralInfo g where g.arbitrator like '%Bulel%' ");
List < Object > ass2 = null;
ass2 = q.list();
log(INFO, " Size from wizard " + ass2.size());
List < AsignoreTypes > res2 = null;
res2 = new ArrayList < AsignoreTypes > ();
Iterator < Object > iterator = ass2.iterator();
while (iterator.hasNext()) {
        Boolean f = null;
Object[] row = (Object[]) iterator.next();
AsignoreTypes ass = new AsignoreTypes();
if (row[0] != null) ass.setFirstname(row[0].toString());
if (row[1] != null) ass.setLastname(row[1].toString());
if (row[2] != null) ass.setDoa(formatter.parse(row[2].toString()));
for (AsignoreTypes a1: res1) {

        f = ass.equals(a1);
}
        if (f == false) {
        res2.add(ass);
log(INFO, "Got matchig element " + ass.getLastname());
}
        }
        log(INFO, "List tow size " + res2.size() + " List hash set size ");
HashSet < AsignoreTypes > asigors = new HashSet < AsignoreTypes > ();
HashSet < AsignoreTypes > wiz = new HashSet < AsignoreTypes > ();
asigors.addAll(res1);
wiz.addAll(res2);
wiz.removeAll(asigors);

log(INFO, "Added to hash set " + asigors.size());

log(INFO, "Added assignors to the list " + wiz.size());

だからここに私が理解していない部分があります私はオブジェクトに等価メソッドを実装していますが、等価は1つまたは2つの一致を返します... 2012-09-01 18:49:09,910 INFO [com.equality.service.CopareToServices] - (スレッド1008 CopareToServices.compareObjects を呼び出します) 等値メソッドは 1 つの重複レコードのみを検出しました >>>

しかし、最後にリストにremoveAllを実装すると、結果

そして、これは heshSet 2012-09-01 18:49:09,918 INFO [com.equality.service.CopareToServices] に removeAll を実装した後です - (スレッド 1008 は CopareToServices.compareObjects を呼び出します)

171個の重複が削除されましたが、これは正しいように聞こえます...

リストにremoveAllを実装するとリストが適切にフィルタリングされるのに、等式メソッドが機能しないのはなぜですか

同じ出力であまりにもApache Commonsでイコールビルダーを試してみました

誠意をこめて私が得ることができる助けをApriciateします

4

1 に答える 1

1

よく理解できれば、問題は次のとおりだと思います。

for (AsignoreTypes a1: res1) {
    f = ass.equals(a1);
}

これは の最後の要素だけをテストするようなものだからですres1


編集:修正の提案:

private List<AsignoreTypes> getAssignoreTypesList(final String sql) {
    final List<AsignoreTypes> result = new ArrayList<AsignoreTypes>();
    final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    final Session session = service.getDataServiceManager().getSession();
    final Query query = session.createQuery(sql);
    final List<?> rows = query.list();
    for (final Object row : rows) {
        final Object[] columns = (Object[]) row;
        final AsignoreTypes ass = new AsignoreTypes();
        ass.setFirstname((String) columns[0]);
        ass.setLastname((String) columns[1]);
        if (columns[2] != null) {
            try {
                ass.setDoa(formatter.parse(columns[2].toString()));
            } catch (final ParseException e) {
                // ignore?
            }
        }
        result.add(ass);
    }

    return result;
}

public void foo()
{
    final List<AsignoreTypes> assignorInfos = getAsignoreTypesList("select upper(ass.firstName), upper(ass.lastName), ass.doa from AssignorInfo ass");
    log(INFO, "List one size " + assignorInfos.size());

    final List<AsignoreTypes> generalInfos = getAsignoreTypesList("select upper(g.fname), upper(g.lname), g.doa from  GeneralInfo g where g.arbitrator like '%Bulel%' ");
    log(INFO, "Size from wizard " + generalInfos.size());

    final List<AsignoreTypes> filtered = new ArrayList<AsignoreTypes>();
    for (final AsignoreTypes asignoreTypes : generalInfos) {
        if (!assignorInfos.contains(asignoreTypes)) {
            filtered.add(asignoreTypes);
            log(INFO, "Got matching element " + asignoreTypes.getLastname());
        }
    }

    log(INFO, "Filtered : " + filtered.size() + "/" + generalInfos.size());
}

List#contains(Object)を参照してください

于 2012-09-02T05:45:31.687 に答える