Странное поведение при использовании HashSet - PullRequest
0 голосов
/ 05 мая 2011

Я использую HashSet для хранения объектов нового типа, которые я написал.Определение типа имеет следующий вид:

class Node{
     Node arr[] = new Node[5];
     boolean flag = false;
}

Я переписал hashCode следующим образом:

int hash = Arrays.deepHashCode(arr);
if(flag==true)
    return hash;
else
    return -hash;

и равен:

public boolean equals(Object other){
     Node t = (Node) other;
     return Arrays.deepEquals(arr, t.arr)&&(flag==t.flag);
}

Я добавляю словав узлы (узлы три узла), и я делаю это в порядке словаря.Затем я храню узлы в хэш-сет.Странно то, что хотя хэш-набор отлично работает для слов, начинающихся с одной буквы, как только я получаю слова, начинающиеся со следующей буквы, мой код застревает.Например, все прекрасно работает для слов, начинающихся с «а», но как только они попадают к словам, начинающимся с «б», они застревают.То же самое для 'c' и 'd' и т. Д.

Я сузил его до одной строки кода: строки, где я добавляю узел в хэш-набор.

Поскольку я не писал хешсет, я не знаю, что здесь происходит.Я уверен, что именно здесь код застревает (он не падает. Кажется, что цикл бесконечный, но я не уверен).Кто-нибудь знает, что происходит?

- Правка -

Множество царапин на голове и много печатных утверждений позже, я решил, что график, который я делал, на самом деле не был DAG, дажехотя так и должно быть, поэтому функции deepHashCode и deepEquals были сброшены.

Ответы [ 2 ]

1 голос
/ 05 мая 2011

Что произойдет, если вы не переопределите метод hashCode ()?Вы ссылаетесь на один и тот же узел в своих массивах узлов, который может объяснить бесконечный цикл, но тогда вы должны увидеть некоторые исключения переполнения стека.Постарайтесь не переопределять метод hashCode (), означающий использование равенства ссылок, это все еще происходит?Если это не так, то в вашем текущем hashCode () что-то не так.

0 голосов
/ 05 мая 2011

HashSet будет делать только две вещи с вашими узлами: вызывать hashCode () и сравнивать их с помощью equals (). Попробуйте набрать control-break (в windows) или отправить сигнал INT3 (в linux), чтобы получить дамп потока.

Первое, что нужно посмотреть, - это методы hashcode () и equals () - есть ли у вас случай, когда вы попадете в бесконечный цикл?

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