加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java设置有多个相等标准

发布时间:2020-12-15 02:08:21 所属栏目:Java 来源:网络整理
导读:我有一个特殊的要求,我需要根据相等标准的组合重复删除对象列表. 例如如果出现以下情况,两个学生对 1. firstName和id相同OR 2. lastName,class和emailId相同 我打算使用Set来删除重复项.但是,有一个问题: 我可以覆盖equals方法,但hashCode方法可能不会为两
我有一个特殊的要求,我需要根据相等标准的组合重复删除对象列表.

例如如果出现以下情况,两个学生对
1. firstName和id相同OR 2. lastName,class和emailId相同

我打算使用Set来删除重复项.但是,有一个问题:
我可以覆盖equals方法,但hashCode方法可能不会为两个相等的对象返回相同的哈希码.

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;

    Student other = (Student) obj;
    if ((firstName.equals(other.firstName) && id==other.id) ||
            (lastName.equals(other.lastName) && class==other.class && emailId.equals(other.emailId ))
        return true;        
    return false;
}

现在我无法覆盖hashCode方法,因为它根据此equals方法为两个相等的对象返回相同的哈希码.

有没有办法根据多个平等标准进行重复数据删除?我考虑使用List然后使用contains方法来检查元素是否已经存在,但是这增加了包含在O(n)时间内运行的复杂性.我不想为所有对象返回完全相同的哈希码,因为这只会增加时间并超过使用哈希码的目的.我还考虑过使用自定义比较器对项目进行排序,但是再次需要至少O(n log n),再加上一个步骤来删除重复项.

截至目前,我所拥有的最佳解决方案是维护两个不同的集合,每个集合对应一个条件并使用它来构建一个List,但这几乎占用了三倍的内存.我正在寻找一种更快,更有效的内存方式,因为我将处理大量的记录.

解决方法

您可以使Student Comparable并使用TreeSet. compareTo的简单实现可能是:

@Override
public int compareTo(Student other) {
    if (this.equals(other)) {
        return 0;
    } else {
        return (this.firstName + this.lastName + emailId + clazz + id)
                .compareTo(other.firstName + other.lastName + other.emailId + clazz + id);
    }
}

或者创建自己的Set实现,例如包含不同Student对象的List,每次添加学生时都要检查是否相等.这将增加O(n)的复杂性,因此不能被认为是一个好的实现,但编写起来很简单.

class ListSet<T> extends AbstractSet<T> {
    private List<T> list = new ArrayList<T>();

    @Override
    public boolean add(T t) {
        if (list.contains(t)) {
            return false;
        } else {
            return list.add(t);
        }
    }

    @Override
    public Iterator<T> iterator() {
        return list.iterator();
    }

    @Override
    public int size() {
        return list.size();
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读