Как реализовать класс, который оценивает содержит в списке
У меня есть: - MyClass с перезаписанным hashCode() - я постараюсь избежать добавления второго экземпляра MyClass с тем же содержимым в список List, используя метод List () объекта List.
Как я могу достичь этого? Я думал, что это делается путем переопределения метода hashCode()?
Я думаю, код говорит больше, чем слова
public class TestClass {
public static void main(String[] args){
MyClass myclass1 = new MyClass(2);
MyClass myclass2 = new MyClass(2);
List<MyClass> myclasses = new ArrayList<MyClass>();
myclasses.add(myclass1);
if(!myclasses.contains(myclass2)){
myclasses.add(myclass2);
System.out.println("I'll add ...");
}
System.out.println(myclasses.size());
}
}
public class MyClass {
int id = -1;
String something = "";
public MyClass(int idparam){
this.id = idparam;
}
@Override
public int hashCode() {
return id;
}
}
Обновленный класс:
public boolean equals(MyClass secondmyclass) {
return secondmyclass.id == this.id;
}
1 ответ
Вы должны переопределить методы equals и hashcode. Объект не содержится в списке, так как он не равен ни одному экземпляру в списке, даже если он генерирует тот же хэш-код.
@Override
public boolean equals(Object obj) {
boolean eq = false;
if (obj != null && obj instanceof YOURCLASS) {
eq = this.getId().equals((YOUCLASS)obj.getId());
}
}
Метод равно должен выглядеть следующим образом. YOURCLASS - это имя компонента, добавленного в список. Вы должны сравнить ключевые поля после проверки того, что экземпляр obj не равен NULL и имеет тот же тип, что и исходный экземпляр.
В вашем примере YOURCLASS - это MyClass, и сравнение внутри equals должно быть с == вместо equals, так как вы не используете int вместо int для поля.