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, которые, как мне кажется, хороши, поскольку они сравнивают все атрибуты состояния.
Любой совет будет принят с благодарностью.
if(anotherState instanceof MazeState)return false;
вместо этого следует проверять, не ли это экземпляр. - person khelwood   schedule 24.10.2018cheeses
? Если эта коллекция содержит объекты, которые вы определили, вам также необходимо реализоватьequals(Object o)
дляcheese
. - person Pants   schedule 24.10.2018