Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по HashSet / 10 сообщений из 10, страница 1 из 1
26.11.2015, 12:51
    #39113933
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по HashSet
Код: java
1.
2.
3.
4.
5.
6.
7.
Set set = new HashSet();
        set.add(new Person("Joe", 33, 400));
        set.add(new Person("Kris", 25, 300));
        set.add(new Person("Julia", 30, 100));
        set.add(new Person("Julia", 30, 100));

        System.out.println(set);



Как известно, для сравнения объектов HashSet использует equals, я переопределила его, согласно моей бизнес логике Person равны, когда равны номера паспортов. Т.е.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
public static class Person implements Comparable<Person> {
        private int age;
        private String name;
        private int passportCode;


        public Person(String name, int age, int passportCode) {
            this.age = age;
            this.name = name;
            this.passportCode = passportCode;
        }


        @Override
        public boolean equals(Object obj) {
            boolean result = false;
            Person p = (Person)obj;
            if(p.passportCode == this.passportCode){
                result = true;
            }
            return result;
        }


        @Override
        public int compareTo(Person o) {
           if(this.passportCode < o.passportCode){
                return -1;
            } else if(this.passportCode > o.passportCode){
                return 1;
            } else {
                return 0;
            }
        }


        @Override
        public String toString() {
            return "Name: " + name + " age: " + age + " passportCode: " + passportCode +" ---- ";
        }
    }


Но почему-то выдает все объекты в консоль:
Код: java
1.
[Name: Joe age: 33 passportCode: 400 ---- , Name: Julia age: 30 passportCode: 100 ---- , Name: Julia age: 30 passportCode: 100 ---- , Name: Kris age: 25 passportCode: 300 ---- ]


Почему две Julia?
...
Рейтинг: 0 / 0
26.11.2015, 12:58
    #39113945
Andrew1411
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по HashSet
JulT
Как известно, для сравнения объектов HashSet использует equals, я переопределила его, согласно моей бизнес логике Person равны, когда равны номера паспортов.


Почему две Julia?
потому что хешкоды разные. сравнение идет только в том случае, когда хешкоды одинаковые
...
Рейтинг: 0 / 0
26.11.2015, 12:58
    #39113946
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по HashSet
JulTКак известно, для сравнения объектов HashSet использует equals
Как известно, JavaDoc к классу java.lang.Object стоит знать.
...
Рейтинг: 0 / 0
26.11.2015, 13:12
    #39113963
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по HashSet
JulT, современные IDE могут сгенерить тебе реализацию hashCode(). Не всегда
она идеальна но в твоём случае сойдет.
...
Рейтинг: 0 / 0
26.11.2015, 13:17
    #39113972
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по HashSet
Ну ок, сделала так:
Код: java
1.
2.
3.
4.
@Override
        public int hashCode() {
            return 0;
        }


все, естественно, заработало. НО!
при одинаковом хэш коде, если я захочу, например, добавить свои данные в коллекцию типа хеш, все они будут скапливаться в одной корзине, что по сути приведет к тому, что моя хэш коллекция выродится в List. Как быть?
...
Рейтинг: 0 / 0
26.11.2015, 13:19
    #39113973
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по HashSet
а, сорри, я ведь могу сделать хеш завязанный на passportCode
...
Рейтинг: 0 / 0
26.11.2015, 13:36
    #39113993
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по HashSet
JulTа, сорри, я ведь могу сделать хеш завязанный на passportCode
а так же на age и на name
...
Рейтинг: 0 / 0
26.11.2015, 13:40
    #39113998
Andrew1411
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по HashSet
JulT,

хешкод и иквалс взаимосвязанные

если иквалс дает истину - то хешкоды должны быть одинаковыми
если хешкоды разные - иквалс должен обязательно давать ложь

ну и естественный результат - когда хешкоды одинаковы, а иквалс ложь


несоблюдение правил приведет к проблемам хешколлекций

и еще, у объекта, помещенного в хеш коллекцию не должен меняться хешкод, иначе не получиться найти объект, потому что он будет искать в корзине, соответствующей новому хешу, а он будет валяться в другой корзине.

для ознакомления можно почитать http://habrahabr.ru/post/168195/
раз уж гугл забанен :)
...
Рейтинг: 0 / 0
26.11.2015, 14:15
    #39114032
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по HashSet
BlazkowiczJulTа, сорри, я ведь могу сделать хеш завязанный на passportCode
а так же на age и на name
+
...
Рейтинг: 0 / 0
26.11.2015, 14:22
    #39114041
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по HashSet
Andrew1411JulT,

хешкод и иквалс взаимосвязанные

если иквалс дает истину - то хешкоды должны быть одинаковыми
если хешкоды разные - иквалс должен обязательно давать ложь

ну и естественный результат - когда хешкоды одинаковы, а иквалс ложь


несоблюдение правил приведет к проблемам хешколлекций

и еще, у объекта, помещенного в хеш коллекцию не должен меняться хешкод, иначе не получиться найти объект, потому что он будет искать в корзине, соответствующей новому хешу, а он будет валяться в другой корзине.

для ознакомления можно почитать http://habrahabr.ru/post/168195/
раз уж гугл забанен :)
Спасибо)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по HashSet / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]