2009-12-01 4 views
0

Я работаю над проектом, который включает меня, используя HashSet класса I, который я назову Test. Я определил заявленная HashSet так:Почему мой класс не работает должным образом в Java HashSet?

HashSet<Test> t = new HashSet<Test>(); 
t.add(new Test("asdf", 1)); 
t.add(new Test("hello", 2)); 
t.add(new Test("hello", 3)); 

Я попытался с помощью

t.contains(new Test("asdf", 1)); 

но он возвращает false. Однако, когда я использую HashSet<Character>, он работает нормально. Я попытался переопределить предыдущую декларацию equals, но это не сработало. Я попробовал оставить equals один, но у меня все еще есть false. Мне нужно знать, что я делаю неправильно?

также, я не редактировал хеш-функцию, я только изменил Test.equals (Object o). Это простой проект, и поскольку в java-документации указано, что он использует o.equals (это), я думал, что мне это не понадобится.

+1

Можете ли вы опубликовать свой тестовый класс, в частности, методы equals и hashCode. – Joel

+0

'HashSet.add' принимает только один аргумент, а не два. И ваш второй блок кода содержит синтаксическую ошибку. – Thomas

+4

Кроме того, точка HashSet заключается в том, что ваш HashSet будет содержать экземпляры Test. Таким образом, это должно быть t.add (новый тест («asdf», 1)); – Mike

ответ

5

Возможно, вам придется перегрузить метод hashCode().

+10

Это должно быть «воля», а не «возможно». –

2

Внутренне хэш-таблица будет использовать объект hashCode() для хэша и ведра ваших объектов и Object # equals() для проверки равенства, если есть конфликты hashCode. Вы должны убедиться, что ваш класс Test предоставляет подходящие реализации (переопределяет) их в вашем случае для проверки равенства строк, в противном случае метод Object equals() по умолчанию будет использовать идентификатор экземпляра объектов (ref id). См. here для учебника по этой теме.

4

HashSet.add(Object data) не равна HashSet.add(new Test(String, int))

Try использовать HashSet.add(new Test("asdf", 1));. И сделайте переопределения из метода hashCode(). Содержит ли ваш код?

3

Ваш код не будет даже скомпилировать ...

HashSet не имеет метод Add(), который принимает два аргумента.

Если вы имеете в виду

t.add(new Test("asdf", 1)); 

в смену

t.add("asdf", 1); 

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