HashSet содержит функцию, которая не работает должным образом

while(!open.isEmpty()&& !solutionFound){
        Node selected=open.poll();//fifo
        State estado=selected.getState();
        estado.toString();
        this.exploredNodes++;       

        if(!explored.contains(selected.getState())  ){
            if(problem.testGoal(selected.getState())){
                actionSequence=recoverPath(selected, inicial);//return array with solutions
                solutionFound=true;
            }

            //totalCost++;
            successors=getSuccessors(selected);
                for(Node successor : successors){
                    //if(!explored.contains(successor))
                        open.add(successor);

                }
                explored.add(selected.getState());

        }

    }

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

Дело в том, что он всегда возвращает false. И поэтому сравнивает бесконечно.

@Override
public boolean equals(Object anotherState) {
    if(anotherState instanceof MazeState)return false;


            if(this.life!=((MazeState)anotherState).life)return false;
            if (this.position.x!=((MazeState)anotherState).position.x)return false;
            if (this.position.y!=((MazeState)anotherState).position.y)return false;
            if (!this.cheeses.containsAll(((MazeState)anotherState).cheeses))return false;

            return true;


}

@Override
public int hashCode() {

    return Objects.hash(this.position,this.life,this.cheeses);

Это мои реализации equals и hashCode, которые, как мне кажется, хороши, поскольку они сравнивают все атрибуты состояния.

Любой совет будет принят с благодарностью.


person Javi    schedule 24.10.2018    source источник
comment
Опечатка: предположительно if(anotherState instanceof MazeState)return false; вместо этого следует проверять, не ли это экземпляр.   -  person khelwood    schedule 24.10.2018
comment
Кроме того, что такое cheeses? Если эта коллекция содержит объекты, которые вы определили, вам также необходимо реализовать equals(Object o) для cheese.   -  person Pants    schedule 24.10.2018


Ответы (1)


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

if(!(anotherState instanceof MazeState)) return false;

ОБНОВИТЬ

Кроме того, проверка containsAll сообщит, что два объекта равны, даже если коллекции сыров имеют элементы в разном порядке.

person Ankur Chrungoo    schedule 24.10.2018
comment
Люблю, когда кто-то публикует ответ, уже данный в комментариях. - person Pants; 24.10.2018
comment
@Pants хм ... дубликаты возникают, когда разные люди публикуют ответы и добавляют комментарии примерно в одно и то же время при чтении вопроса ... на самом деле это не намеренно. - person Ankur Chrungoo; 24.10.2018
comment
Это правда, но все же он проверяет узлы, которые уже были исследованы. - person Javi; 24.10.2018
comment
Не могли бы вы поделиться более подробной информацией о том, что именно происходит? - person Ankur Chrungoo; 24.10.2018
comment
Вы выполняете проверку containsAll, что означает, что две коллекции, содержащие одинаковые элементы, но в разном порядке, приведут к тому, что они будут сообщены как равные - person Ankur Chrungoo; 24.10.2018