Поиск одинаковых объектов в Java - PullRequest
0 голосов
/ 03 апреля 2012

Я создаю кучу объектов на Java.Каждый объект имеет область атрибутов и набор целых чисел.Я хочу хранить эти объекты, например, на карте (ключи должны быть целыми числами в возрастающем порядке).Два объекта одинаковы, если их площадь равна и их наборы одинаковы.

Если два объекта не имеют одинаковую площадь, мне нет необходимости проверять, совпадают ли их наборы.

Каков наилучший способ реализации этого в Java?Как мне составить хэш и равные функции?

Ответы [ 4 ]

1 голос
/ 03 апреля 2012

Вот примерная пара hashCode\equals, сгенерированная IDE:

class Sample  {
    final int area;
    final Set<Integer> someData;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Sample sample = (Sample) o;

        if (area != sample.area) return false;
        if (!someData.equals(sample.someData)) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = area;
        result = 31 * result + someData.hashCode();
        return result;
    }
}

Этот код предполагает, что someData не может быть нулевым - для упрощения вещей. Вы можете видеть, что сначала проверяется равенство типов, затем проверяется равенство area, а затем проверяется равенство Set<Integer>. Обратите внимание, что для этого используется встроенный equals из Set - так что вы можете использовать этот метод повторно. Это идиоматический способ проверки составных типов на равенство.

1 голос
/ 03 апреля 2012

Просто сравните их область сначала в equals (после == и проверки типа, конечно) и верните false, если они различаются. Если области равны, продолжайте и сравните наборы.

Для реализации equalshashCode) в целом, здесь соответствующая тема и хорошая статья (включая несколько дальнейших ссылок).

1 голос
/ 03 апреля 2012

Практическое правило заключается в том, что вы должны сравнить все соответствующие поля в вашей реализации equals() (сначала быстрее всего, поэтому сначала сравните ваши area, а затем целые числа) и используйте те же поля в ваших hashCode(),В случае сомнений используйте функцию Source - Generate hashCode() and equals()... Eclipse (а затем исправьте код equals(), чтобы сначала сравнить area).

1 голос
/ 03 апреля 2012

Вам просто нужен ваш объект для реализации Comparable интерфейса и кодирования вашей логики в методе compareTo.Вот хорошая ссылка , чтобы помочь вам достичь этого.

...