Java设置有多个相等标准
我有一个特殊的要求,我需要根据相等标准的组合重复删除对象列表.
例如如果出现以下情况,两个学生对 我打算使用Set来删除重复项.但是,有一个问题: @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(); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |