gpt4 book ai didi

具有多个相等标准的 Java Set

转载 作者:搜寻专家 更新时间:2023-11-01 03:49:45 26 4
gpt4 key购买 nike

我有一个特殊要求,我需要根据相等标准的组合对对象列表进行重复数据删除。

例如如果满足以下条件,则两个 Student 对象相等:
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 方法来检查元素是否已经存在,但这增加了复杂性,因为 contains 在 O(n) 时间内运行。我不想为所有对象返回完全相同的哈希码,因为这只会增加时间并超出使用哈希码的目的。我还考虑过使用自定义比较器对项目进行排序,但这同样至少需要 O(n log n),再加上一次删除重复项的操作。

到目前为止,我拥有的最佳解决方案是维护两个不同的集合,每个集合对应一个条件,然后用它来构建一个 List,但这几乎占用了三倍的内存。我正在寻找一种更快且内存效率更高的方法,因为我将处理大量记录。

最佳答案

您可以制作Student Comparable 并使用TreeSetcompareTo 的简单实现可能是:

@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 实现,例如包含一个 List 不同的 Student 对象,每次添加学生时检查是否相等.这将 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();
}
}

关于具有多个相等标准的 Java Set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31701734/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com