Почему мой класс не работает должным образом в Java HashSet?

StackOverflow https://stackoverflow.com/questions/1827420

  •  11-09-2019
  •  | 
  •  

Вопрос

Я работаю над проектом, который предполагает, что я использую HashSet из класса, который я создал, который я назову Test.Я определил заявленное 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(объект o).Это простой проект, и поскольку в документации Java указано, что он использует o.equals (this), я подумал, что мне не придется этого делать.

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

вместо

t.add("asdf", 1);

убедитесь, что метод hashcode и equals тестового класса реализованы должным образом, как было сказано ранее.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top