2010-12-10 4 views
1

これは宿題に関する質問です。私はJavaの古典的なn-Queens問題の解決策を書いています。私のプログラムはthisのように見えますが、それらを印刷する代わりにすべての法的なクイーンのプレースメントのコレクションを返します。私はクイーンズの配置をint[]と表し、HashSet<int[]>を使用してSet<int[]>を返します。プレースメントの順序は重要ではないため、ここではSetが適切です。Javaの古典nクイーンズに関するインプリメンテーションの質問

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

私はArrays.deepHashCodeでアレイとオーバーライドhashCodeを保持しているラッパークラスQueensPlacementsを、書き込み、およびSet<QueensPlacement>を返すことができます。しかし、それは冗長であり、控えめであるようです。誰もより良い解決策を提案できますか?

+1

おそらくラッパークラスが良いでしょう - Set が物事をより明白にするので、それは控えめではありません。セット。ハッシュコードのようにint []で他の問題にぶつかるでしょう。たとえば、正確にn個のクイーンズがあることを確認するにはどうすればいいのですか?つまり、サイズはnですか? – Fakrudeen

答えて

2

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

1

なぜでしょうかSet<List<Integer>>

1

私は配列を保持し、Arrays.deepHashCodeでのhashCodeをオーバーライドするラッパークラスのQueensPlacementsを、書き込み、およびSetを返すことができます。しかし、それは冗長であり、控えめであるようです。

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

*編集:*

がQueensPlacementは概念的な問題(それはコンピュータには関係ありません)のために厳密には必要ではないの配置の間で一貫性の発注のためのComparator<QueensPlacement>を提供することができますが、作るかもしれないことをあまりにも考えてみましょうUIが少し上手くなりました(たとえば、同等のプレースメントセットが同じ順序で表示されていた場合は、ユーザーにとってはうれしいでしょう)。

関連する問題