Как реализовать класс, который оценивает содержит в списке

У меня есть: - 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 для поля.

Другие вопросы по тегам