1

これは宿題の質問です。n-QueensJavaの古典的な問題の解決策を書いています。私のプログラムは次のようになりますが、それらを出力する代わりに、すべての正当なクイーン配置のコレクションを返します。クイーンの配置を として表し、その実装として使用してint[]返します。(配置の順序は重要ではないため、ここでは適切です)。Set<int[]>HashSet<int[]>Set

問題は、Java 配列がオーバーライドhashCodeされず、同じ値を持つ異なる配列インスタンスが異なるハッシュ コードを持つことです。

QueensPlacements配列を保持し、でオーバーライドhashCodeするArrays.deepHashCodeラッパークラスを記述できますSet<QueensPlacement>。ただし、冗長でエレガントではないようです。誰でもより良い解決策を提案できますか?

4

3 に答える 3

2

インターフェイスを実装するいくつかの標準クラスがありSetます。を使用してTreeSet、独自のコンパレータを提供できます。

于 2010-12-10T10:39:42.170 に答える
1

配列を保持し、HashCodeをArrays.deepHashCodeでオーバーライドするラッパークラスQueensPlacementsを記述して、Setを返すことができます。しかし、それは冗長でエレガントではないようです。

カスタムクラスを作成することは悪い考えではないかもしれません。データを渡すためだけにラッパークラスを作成しているのではないかと心配しているようですが、ソリューションドメインの本格的な部分にするために提供できるメソッドは他にありませんか?配置セットを受け取るコードはそれで何をしますか?その受信コードのために物事を容易にするために配置が提供できる方法はありますか?少なくともデバッグするための素晴らしいtoString()メソッド?

*編集: *

QueensPlacementは、Comparator<QueensPlacement>プレースメント間で一貫した順序を提供できることも考慮してください。これは、概念的な問題には厳密には必要ありませんが(コンピューターには関係ありません)、UIを少し良くする可能性があります(たとえば、より良いとは言えません)。同等のプレースメントのセットが同じ順序で表示された場合のユーザーの場合)。

于 2010-12-10T11:01:38.023 に答える
1

なぜSet<List<Integer>>ですか?

于 2010-12-10T10:56:40.783 に答える