java の演習がひととおり終わりました。

このあとは、今日までにやった java の演習を行う為のドキュメントを作成します。
ということで、メモです。

Reader と Writer の実装

課題1:'<‘ を “<” に、’>’ を “>” にする Reader の実装

最初に、char 配列に read するメソッドを実装しようとしたんですが、「読み込む長さと書き込む長さが変わることがある」という部分が面倒そうだったので、1文字だけ read するメソッドを作成することに。
(これにより、いったん Reader のサブクラスではなくなりました)
変換する文字だった場合、次回(以降)の read は、mReader から読むのではなく、変換後の文字列の続きの文字を出力すれば良いという考えで、それなりにすんなりできました。
効率は良くないですが、これを使って char 配列への read を実装しました。

多少でも早くなるポイントとして指摘してもらったのは、

・比較は 0 との比較にした方が早い。
・char 配列のインデックスを毎回足し算してるのを変数1つにした方が良い。
・String の連結ではなく StringBuilder を使うほうが良い。

課題2:課題1の内容を Writer で実装

今回の場合、実装自体はこちらが簡単。特に問題なし。

Reader(pull型) でも Writer(push型)でも同様な機能が実装できるが、どちらのほうが良いのかは使用する条件次第ということでした。
たとえば、変換元のデータが逐次発生する場合は Reader で実装した方が良い…とも思いましたが、Writer の方が良いのか…
自分で納得のできる事例を思いつかないというか本質を理解していない感がありますが。

基本的に最終主力処理は Writer で、それ以外の(中間処理?)は Reader でとのことで、遅延評価、遅延初期化がキーワードです。また調べたらなにかメモります。

テーブルの処理

課題1:「配列、リスト、九九」のデータを、「タブ区切り、html」で表として出力する。

まずは、データは Iterator っぽく抽象化、出力は「行、列、表全体」のヘッダ&フッタを取得するインターフェイスで無理やり感がありまくりで抽象化したものをつくりました。

ここでのポイントは、抽象化が必要かどうかと、抽象化の仕方ということで、データは最終的には、getCount() とgetValue() を持つインターフェイスに抽象化し、出力は別メソッドとして作りました。

データは、表だけあって行と列の指定で値を取り出せるようにすべきでした。Iterator をやったばかりといってサルのようにIterator はダメですね。自分でランダムアクセスしたい場合使うなって書いておいて。

出力は、今回のものは何とかできましたが、たとえば GUI で出力しようとした場合、やたらインターフェイスのメソッドが増えるだけ(でもタブ区切りでは不必要)で、抽象化する必要はなかったです。

課題2:以下の処理を行うデータのインターフェイスのサブクラスを作成する。

・転置(漢字合ってる? 行列を入れ替える)
・部分の抽出
部分抽出は行列それぞれのインデックスとカウントを指定して、転置は列と行の指定を入れ替えるだけで完了。
# 九九の表を転置して、入れ替わらない理由でしばらく停止したのは…

このようなデータ(Model)、表示(View)と、ここでは使っていないけどユーザの入力(Controller)を分割して考えるものを Model View Controller(MVC)と呼ぶとのことです。
GUI 部分はこの構造(方法論)でつくられているものが多いそうです。
MVC の Model と Controller を Document として考える Document-View というものあります。

ソート

課題1:さまざまなデータを、さまざまな条件でソートする機能の作成。

アルゴリズムはバブルソートを使用。

データは、Model インターフェイスとして抽象化し、要素総数の取得、要素の取得、要素の入れ替え、の3つの機能を作成。

Selection インターフェイスとして、2つの要素を比較して、大小比較結果を返すメソッドを作成。

ConditionOrder インターフェイスとして、上記の比較結果から、真偽値を返すメソッドを作成。
これは、昇順と降順の切り替えを想定して作成しました。

Selection と ConditionOrder を分けるかどうかは多分に迷ったところですが、分けないと
・名前の昇順
・名前の降順
・年齢の昇順
・年齢の昇順
という Condition のサブクラスの作成が必要になるのでは?と思い分けました。
が、これは、そもそも間違いで、最終的には、比較結果を返すメソッドを持つ Condition インターフェイスだけを作成して、「名前で昇順」、「年齢で昇順」、「引数に Condition をもらい逆順にする」クラスを実装しました。

指摘点その2は、Selection の名前。
実装の内部では実際に名前か年齢かを選択しているので Selection とつけましたが、インターフェイスのメソッドを見ると2つの要素の比較する機能なので、それに見合った名前をつけるべきとのこのとでした。

課題2:Map を使って、名前や年齢に関係ない、外部(?)の値でソートする。

Map とか Hash に関して調べるのに時間をとりましたが、コードはすぐに完成。

Map は、キーの値の対応の集合で、Hash はデータからなるべるユニークな値を得る、もしくは得た値のことと理解しました。

ということでバイト4日目終了です。

カテゴリー: 技術情報