Я смотрел другие случаи, когда этот вопрос задавался в StackOverflow, но ни один из других вариантов использования, похоже, не решил мою проблему. HashSet, похоже, не понимает, что два объекта одинаковы.
По сути, это мой класс.
private static class Inconsistency
{
int a;
int b;
boolean isConsistency;
//Default constructor. To be used when we don't have an inconsistency
public Inconsistency()
{
this.a = -1;
this.b = -1;
this.isConsistency = false;
}
public Inconsistency(int a, int b, boolean isConsistency)
{
this.a = a;
this.b = b;
this.isConsistency = isConsistency;
}
@Override
public String toString()
{
if (this.isConsistency)
{
return "(" + this.a + ", " + this.b + ")";
}
else
{
return "No inconsistency";
}
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + a;
result = prime * result + b;
result = prime * result + (isConsistency ? 1231 : 1237);
return result;
}
@Override
public boolean equals(Object other)
{
if (this == other)
{
return true;
}
if (other == null)
{
return false;
}
if (this.getClass() != other.getClass())
{
return false;
}
Inconsistency otherInconsistency = (Inconsistency) other;
return ((this.a == otherInconsistency.a) && (this.b == otherInconsistency.b) && (this.isConsistency == otherInconsistency.isConsistency))
|| ((this.a == otherInconsistency.b) && (this.b == otherInconsistency.a) && (this.isConsistency == otherInconsistency.isConsistency));
}
}
Я пытаюсь хранить объекты моегокласс внутри хэш-карты.
При способе, которым я определяю свой метод equals, Inconsistency A (10, 20, true) должен быть равен другому Inconsistency B (20, 10, true) и когда япроверить мой метод равных, это работает правильно.Однако, когда я пытаюсь вставить оба A и B в HashSet, они оба ошибочно добавляются.Я понимаю, что должен манипулировать своей функцией хэш-кода, но я не уверен, как это сделать.
Вот драйвер, демонстрирующий ошибочное поведение
Inconsistency A = new Inconsistency(10,20, true);
Inconsistency B = new Inconsistency(20,10, true);
System.out.println(A.equals(B)); // prints true as expected
HashSet<Inconsistency> test = new HashSet<>();
test.add(A);
test.add(B);
System.out.println(test); // prints [(10, 20), (20, 10)]. The two objects are equal but are both added to hashset
Просто, чтобы вопрос был ясен,Как мне убедиться, что оба равных объекта A и B не будут добавлены в мой HashSet?