Вопрос реализации о классической n-Queens в Java - PullRequest
1 голос
/ 10 декабря 2010

Это домашнее задание. Я пишу решение для классической проблемы n-Queens в Java. Моя программа выглядит как this , но она возвращает коллекцию всех допустимых мест размещения вместо того, чтобы распечатывать их. Я представляю размещение королев как int[] и возвращаю Set<int[]>, используя HashSet<int[]> в качестве его реализации. (Set здесь уместно, так как порядок размещения не важен).

Проблема заключается в том, что массивы Java не переопределяют hashCode, а разные экземпляры массива с одинаковыми значениями имеют разные хэш-коды.

Я могу написать класс-оболочку QueensPlacements, который содержит массив и переопределяет hashCode с помощью Arrays.deepHashCode и возвращает Set<QueensPlacement>. Однако это кажется многословным и не элегантным. Кто-нибудь может предложить лучшее решение?

Ответы [ 3 ]

2 голосов
/ 10 декабря 2010

Существует несколько стандартных классов, которые реализуют интерфейс Set. Вы можете использовать TreeSet и предоставить свой собственный компаратор.

1 голос
/ 10 декабря 2010

Я могу написать класс-оболочку QueensPlacements, который содержит массив и переопределяет hashCode с помощью Arrays.deepHashCode и возвращает Set.Однако это кажется многословным и не элегантным.

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

* Редактировать: *

Также учтите, что QueensPlacement может предоставить Comparator<QueensPlacement> для последовательного упорядочения мест размещения, что не является строго необходимым для концептуальной проблемы (это не имеет значения длякомпьютер), но может сделать пользовательский интерфейс немного приятнее (например, не будет ли лучше для пользователя, если эквивалентные наборы мест размещения будут отображаться в том же порядке).

1 голос
/ 10 декабря 2010

Почему бы не Set<List<Integer>>?

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