Есть ли способ удалить объект при его создании? - PullRequest
1 голос
/ 07 января 2020

Я готовлюсь к финалу, и я столкнулся с этим вопросом -

Учитывая следующий код, есть ли способ реализации класса A, такой, что в конце он напечатает 5 в один прогон программы, затем другой прогон программы 4, затем другой прогон 3 ... до 0.

Можно предположить, что это определено c, поэтому функции будут генерировать всегда одинаковые результаты.

Невозможно удалить какой-либо код в классе A, а не в главном, и в состоянии только редактировать класс A.

public class A {

    int i, j;

    public A(int i, int j) {
        this.i = i;
        this.j = j;

    }


    public static void main(String[] args) {

        Set<A> s = new LinkedHashSet<>();
        s.add(new A(3,1));
        s.add(new A(1,3));
        s.add(new A(3,1));
        s.add(new A(3,1));
        s.add(new A(2,1));

        System.out.println(s.size());

    }

}

Я думал добавить какой-то вид c HASHMAP и каждый Когда я создаю объект, я добавляю его туда и проверяю, существует ли один ключ, тогда я хотел бы «не создавать» объект, если он уже существует с такими же значениями ... но не может его реализовать.

1 Ответ

1 голос
/ 07 января 2020

Вы захотите внедрить equals и хэш-код в класс A. Вы должны реализовать их таким образом, чтобы это вызывало коллизии при добавлении элементов в Set s.

По умолчанию должно быть напечатано число 5.

Но, если мы сделаем следующее редактирование:

public class A {

    int i, j;

    public A(int i, int j) {
        this.i = i;
        this.j = j;

    }

    @Override
    public boolean equals(Object obj) {
        // First we check if the object is null
        // Then we check if it's the same class as this one
        if(obj == null || obj.getClass()!= this.getClass()) {
            return false;
        }

        A objectA = (A) obj;

        if(this.i == objectA.i) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public int hashCode() 
    { 

        return this.i; 
    } 

Эта конкретная реализация приведет к распечатке ' 3' . Это потому, что мы установили его так, чтобы хеш-код был равен i. Поэтому, когда мы добавляем два экземпляра класса A в набор, они будут сталкиваться.

В нашем случае, когда добавляются экземпляры класса A, значения для i равны 3, 1, 3, 3, 2, есть 3 уникальных значения i (3, 1, 2), поэтому поэтому он будет print 3.

Отсюда вы можете придумать разные реализации, чтобы получить разные значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...