雑記 2012/04/28/土曜 から 2012/05/22/火曜
前回の続きで主にJava SwingのJTableをいじる。
テキストファイルから文字列を読み込んで二次元配列に落とし込んでJTableに表示。
他にも細かいところをちょこちょこいじったりはしてましたが、
たったコレだけでもまたずいぶんと時間を使いました。
WindowBuilderもバージョンを更新したら解析がかなり早くなりました。
Eclipse Indigo Pleiades All in One 3.7.2.v20120225を入れる際に試しに
BabelLanguagePack(EJWG Babel 言語パック)の一部(eclipse-ja_3.7.0のみ)を入れてみたり。
一部の日本語がPleiadesでの翻訳結果とは微妙に違うものにされてたりしました。
さて、テスト用に簡単な読み込み用のテキストファイルを作り、
自分で設定した文字列を元に切り分けを行うつもりでテキスト内部を記述。
BufferedReaderのreadLineで逐次、一行だけを保持する目的のStringへ読み取った文字列を代入。
(恐らく一般的な while((stringTemp = br.readLine()) != null)で処理。)
その後、テキストファイルの内容全体を保持する為のArrayList<String>にaddする。
ついでに、int型のローカル変数で行数をカウントし、
切り分け用の文字列をif文で条件設定して切り分け用の文字列が出た行数を別のローカル変数に記録。
ここで、一度にまとめて条件分岐から目的の二次元配列への落とし込みをしようかと思いましたが、
二次元配列への落とし込みを終わらせる為の条件を同時進行で処理するのが面倒そうなので(オイ)、
切り分け開始の切り分け用の文字列と、切り分け終了を示す文字列が出る行数の記録にとどめる。
次に先ほど作られたArrayList<String>をfor文で回し、
while文の中のif文で記録した開始行数とfor文のカウントを照合し、それぞれが合致したら、
今度は切り分け開始と終了の差分の間だけ回るfor文へ処理を移行、
その際に、終了から開始のカウントを引いて、その差分を二次元配列の最初の添字部分を作る為に別のint型変数に入れる。
そして、ArrayList<String>からget(for文のカウント)で文字列を取り出し、Stringのローカル変数に格納。
このString変数を「,(コンマ)」区切りでsplitして、一次元配列へ格納し、lengthで要素数を出す。
下準備が終わったので、if文で二次元配列への落とし込み開始条件を設定し、
二次元配列のStringフィールドに、二次元配列の最初の添字部分を作る為のint型変数を入れ、
要素数を示す一次元配列String.lengthを入れる。
ここで何故か、この二次元配列のStringフィールドの添字、要素数部分の設定は一回だけでいいのに毎回設定する様にした為に最期に入った要素以外を全てnullに戻すというオオボケをかます。
なので、落とし込みが始まる最初だけ要素数を入れる処理をif文で分けておき、
配列の配列を示す部分と、配列の配列に入る要素数の部分は別々なので、配列の配列を示す為の別のint型変数を使用。
後はfor文で各要素を二次元配列に代入していく。
冗長すぎる気もしますが、いずれテキストファイルの中身は編集して変動するのでこの様な形にした。
内容を決め打ちか固定に出来るのであれば参考書やネットにある例でほぼ問題なかったんだけど。
ついでに開始条件の最初の行にJTableで使用するカラム名を入れて使用するようにした。
いずれ、while((stringTemp = br.readLine()) != null)を他のやり方に変えて、もっと短く記述できないか試したいな。
if文用の条件とwhile文のループの関係で、if文用の条件の最期にダミーを入れて誤魔化してるところがあるからなぁ・・・。
for文とif文ばかりを使っていて、while文の時に条件判定の為に配列を使った際の挙動の違いを理解してなかった為なんだろうなぁ。
ダミーをかまさなくてもいい方が良さそうに見えると思うし|-`;;)
む・・・、readLineの最期でnullかどうかをループしてみてるとしたら、
どのみち配列で条件分岐判定をする場合、ダミーがいるのかな・・・。
本当に、まだまだ勉強不足ですなぁorz
そしてやっとこさ、JTableの内部を編集する為の記述に入るわけですよ。
セルの昇順、降順のソートが簡単な記述で出来るのは助かりましたが。