У меня есть особое требование, когда мне нужно дедуплировать список объектов на основе комбинации критериев равенства.Java Set с несколькими критериями равенства
например. Два Student
объектов равны, если:
1. Имя и идентификатор является одинаковыми или 2. LastName, класса и 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
, но это занимает почти в три раза больше памяти. Я ищу более быстрый и эффективный способ памяти, так как я буду иметь дело с большим количеством записей.
* «Теперь я не могу переопределить метод hashCode таким образом, чтобы он возвращал одинаковые хэш-коды для двух объектов, которые равны в соответствии с этим методом равных» * Можете ли вы объяснить, почему вы это говорите? – m0skit0
См. Комментарий @ m0skit0. Ваш хэш-код неверен, если он не возвращает одно и то же значение для равных объектов. –
@ m0skit0 Это общий контракт [hashCode] (http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode%28%29): 'Если два объекта: равный в соответствии с методом equals (Object), тогда вызов метода hashCode для каждого из двух объектов должен приводить к одному и тому же целочисленному результату. ' –