コンテンツへスキップ

java演習その2(終了)

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日目終了です。

© 2003 Kurusugawa Computer Inc.