java - 对象平等 Google guava 和 Apache Commons

标签 java guava apache-commons

试图理解我从对象相等中得到的结果...... 好的,首先让我描述一下问题 需要从数据库中过滤两个两个表中的重复对象(Hibenate所有cluses都已设置)预设条件是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 并创建对象列表,对其进行迭代

在其中一个列表中创建第二个列表的嵌套迭代

因此,在我的服务类中,我对 2 个表调用查询并创建自定义列表迭代列表和对象

因此,在我的服务类中,我对 2 个表调用查询并创建自定义列表迭代列表和对象

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

所以这是我不明白的部分,我在对象上实现了相等方法,但相等返回一两个匹配... 2012-09-01 18:49:09,910 INFO [com.equality.service.CopareToServices] - (线程 1008 调用 CopareToServices.compareObjects) 相等方法只找到一条重复记录>>>

但是当最后我在列表上实现removeAll时,结果

这是在heshSet上实现removeAll之后的结果 2012-09-01 18:49:09,918 INFO [com.equality.service.CopareToServices] - (线程 1008 调用 CopareToServices.compareObjects)

171 个重复项被删除,听起来不错......

为什么在列表上实现removeAll可以正确过滤列表,但相等方法不起作用

也尝试了使用 apache commons 的 equals 构建器,具有相同的输出

我能得到任何帮助吗? 真诚的

最佳答案

如果我理解得好的话,我认为问题是:

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)

关于java - 对象平等 Google guava 和 Apache Commons,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12233570/

相关文章:

java - 使用谓词动态过滤列表

java - Apache Commons FTPClient 无法检索某些文件

java - 在 EclipseLink 中分离实体

java - 在 Scene2D 中移动 Sprite

java - 获取 JSON 字符串的值并获取值

Java boolean CLI 选项

java - 如何在 Linux 终端中为 Java 使用 apache commons io?

java - Java JSF 的 Facebook 点赞按钮?

java - java中来自数据库的Json对象

java - 哪个版本的guava兼容java 1.7