前書き
このページは、JavaFXとか使って手探り開発した時のメモの続編のようなもので、あちらを表示に寄った記事にし、こちらを内容に寄った記事にしようというものである。
正直、クラスの設計とかでかなり無駄が多かったので、NumberPlaceSolver 2.0
を始動するにあたって記事を新しくした、というくらいの話。
表示についてはガッツリ排除した。
以前の仕様はこちらには書かないので、元記事を読んでいただきたい。
作ろうとしてるもの
数独解いてくれるモノ。学校の自由課題にて。
環境その他
Java(8) ...はある程度学習済み(使用経験は浅い)
IDEとして、講師オヌヌメのintelliJIDEA(ver.3.2)最近アプデが入って若干UIとか変わった模様。リファクタ機能が強すぎて、こないだeclipse使ったらいろんなところかゆかった。
いくつかの簡単な対応について
- FXMLで指定した
fx:id
はControllerでは@FXML
を直前で指定しないと怒られる。delimiter単位でつけないとやっぱり怒られる。 - 配列xに、配列yを
x=y
みたいにして渡すと(仮称)参照値渡し(後述)となる。xとyは同じオブジェクトを指す名前となる。- 新しい別のオブジェクトとして扱いたい場合はcloneメソッドを使用して、
x=y.clone()
とする。 - この問題はString型の同一の文字列を格納した別のオブジェクトを条件演算子
==
で結ぶ(すなわち、str==new String(str)
)と、オブジェクトの参照値を比較するために、false
が返されることを連想させる。ただしString型自体が若干特殊な仕様を含んでいるようなので、取り扱いに注意すべきか。
- 新しい別のオブジェクトとして扱いたい場合はcloneメソッドを使用して、
- 数独では行と列のほかに、3x3のsubRegionでも重複を禁じている。この3x3のグループを順番に追う式を書いた。
for (int i = 0; i < 9; i++) for (int j = 0; j < 9; j++) {
int idev3= i/3 , jdev3= j/3 ;
int x= idev3 * 3 + jdev3 ,
y= i % 3 * 3 + j % 3 ;
subRegion[x][y] = cell[i][j]
// 逆関数が同様の式になる(名前忘れた)ので、[i][j]と[x][y]は逆にしても目的を果たす。
// subRegion[i][j] = cell[x][y];
}
- 二次元配列
x = new Object[i][j]の
length`について。-
x.length
はi
-
x[0].length
はj
。ただしもしi==0
ならば、ArrayIndexOutOfBoundsException
を吐く。
-
共有データを操作させるにあたって
Javaでは、C言語でいうところのポインタを、「参照変数」とか「参照値」とか呼ぶっぽい。
各リージョンに参照値を納めさせて、テーブル一個分のセルのデータ群だけで処理ができるようにしたい。
つまり、リージョンからの操作で、テーブルに存在するセルのデータも変更されるようにしたい。
以下はつたないイメージ図
各クラスの設計説明の前書き
冒頭でも書いたし、内容読めばわかる人にはわかるでしょうし、プロフにも書いたはずなのでわかるとは思いますが、
わたくし、バリバリの初心者にござる。
何やるにしても拙いものになると思いますので、どうかご容赦を。(批判とか改善策とかのコメントは歓迎いたします。)
同輩の初学者様がたも、こんなの参考にしちゃダメです。参考にするにしても、教育者の意見をもらってからにしましょう。
元記事の同じ場所から後ろは、できれば失敗談として、あるいは比較対象として、
読んでほしくない(読まなくてもわかるように書いていきたい(願望))
ここまで、元記事と同じとはいえ必須と思われる部分。
これからの方針
既に書いた設計を基に、改善したものを作成する。
盛り込みたいこと
- クラス設計見直し : 無駄と思われるメソッドの削除等。
- 複数スレッドで仮置き : 仮置き処理を複数スレッドですることで、処理スピードを底上げ
- 全体のデータを管理するstatic Boardを用意 :「denyされた」情報を全スレッドで共有化