У меня проблемы с HashSets. Моя программа выполняет поиск в ширину, и я создал набор хэшей для отслеживания посещенных состояний. Состояния представлены массивом int[]
. Однако метод contains в HashSet, похоже, не работает должным образом. По сути, это не фильтрация int[]
массивов, которые уже должны были быть добавлены.
Вот соответствующие части моего кода:
private boolean notVisitedAndNotNull(PuzzleState nextPS) {
if (nextPS != null && !this.visited.contains(nextPS.getStateArray))
return true;
return false;
}
private void addToQueue(PuzzleState nextPS) {
if (notVisitedAndNotNull(nextPS))
queue.add(nextPS);
}
private boolean solveByBFS() {
queue.clear();
queue.add(this.initialState);
long startTime = System.currentTimeMillis();
while(!queue.isEmpty()) {
if (queue.size() > maxQueueSize)
maxQueueSize = queue.size();
this.currentState = queue.poll();
if (this.currentState.equals(finalState)) {
System.out.println("Successful! Ending Time: " + startTime);
return true;
}
visited.add(this.currentState.getStateArray()); //this adds int[] array
this.addToQueue(this.currentState.moveUp());
this.addToQueue(this.currentState.moveDown());
this.addToQueue(this.currentState.moveRight());
this.addToQueue(this.currentState.moveLeft());
}
return false;
}
Прошу прощения за публикацию такого большого количества кода. Я немного поискал, и кажется, что для корректной работы HashSet мне пришлось бы реализовать hashCode
и equals
из HashSet
. Я не уверен, что это возможно для массива int[]
. Не лучше ли просто использовать HashMap
, а затем использовать метод toString
для массива int[]
в качестве ключа?
Хорошо, я получил это работает сейчас. Вот код, который я добавил, если кому-то интересно:
@Override
public boolean equals(Object o) {
if (o instanceof PuzzleState) {
return (Arrays.equals(((PuzzleState) o).getStateArray(), this.getStateArray()));
}
return false;
}
@Override
public int hashCode() {
return Arrays.hashCode(this.getStateArray());
}
PuzzleState
equals
и/илиhashCode
, если да, то как...? - person MadProgrammer   schedule 12.09.2014hashCode
иequals
- person MadProgrammer   schedule 12.09.2014