課題A
さて、最初の課題は「実際に Collection API や lambda 式に触って、馴染んでみましょう」というものです。
lambda式でInteger
のソートをしましたが、今度は四角形の並び替えてみましょう。
GUI でも扱う awt パッケージには四角形を表す java.awt.Rectangle や点(整数座標)をあらわす java.awt.Point クラスがあるので、そのあたりも使いましょう。
演習環境の指示に従ってプログラムをチェックアウトしてもらえば、kobeU.cs.kadaiA.RectSorter が未完成な状態でおいてあります。
シナリオ
四角形をいくつかの順でソートするための関数群を作成することになりました。
void sortByArea(List<? extends Rectangle> list)
- 与えられた四角形のリストを、面積の大きい順にソートする
? extends Rectangle
は、皆さんがRectangle
の subclass を作成した場合でも利用できるようにするため。
void sortByDistance(List<? extends Rectangle> list, Point p)
- 与えられた四角形のリストを、各四角形の重心と点
p
の距離の小さい順にソートする
- 与えられた四角形のリストを、各四角形の重心と点
一方で、ちゃんとソート機能が動いているか確認するための関数群も準備することになりました。
public static void customPrintList(String tag, java.util.List<Rectangle> list, Function<Rectangle, String> func)
- 実装済み
- list の各要素を func で変換した結果を順番に1行ずつ出力
- 先頭と最後をしらせるため、
tag
を含む行を表示
public static void sortCheck(List<? extends Rectangle> list, Function<Rectangle, Double> func)
- 未実装
- list の各要素に
func
を施した結果 (double
) が、小さい順にソートされているか確認し、間違いがあれば「なにか」エラーメッセージを出力
最後の main
メソッドでは、
- 冒頭でいくつか四角形を生成し、
- 各ソートを施しては、その結果を確認する ためのルーチンが準備されています。
皆さんのミッションは、ソート機能を完成させ、チェックルーチンも完成させて、動作確認を完了することです。
プログラム実行
最初からプログラムは動きます。といっても、ソート機能は未実装だし、sortcheck()
もないので、サンプルの四角形が何度も表示されるだけですが。
---- Init ---
java.awt.Rectangle[x=0,y=0,width=20,height=19]
java.awt.Rectangle[x=10,y=25,width=13,height=21]
...
java.awt.Rectangle[x=10,y=65,width=19,height=13]
-DONE: Init ---
---- Sort by area (in descending order) ---
...
...
各ソート機能が完成して、デバッグプリントやチェックルーチンも動作したら、こんな感じになる予定。
---- Init ---
java.awt.Rectangle[x=0,y=0,width=20,height=19]
java.awt.Rectangle[x=10,y=25,width=13,height=21]
...
java.awt.Rectangle[x=10,y=65,width=19,height=13]
-DONE: Init ---
---- Sort by area (in descending order) ---
380.0 java.awt.Rectangle[x=0,y=0,width=20,height=19]
273.0 java.awt.Rectangle[x=10,y=25,width=13,height=21]
266.0 java.awt.Rectangle[x=30,y=75,width=14,height=19]
...
156.0 java.awt.Rectangle[x=70,y=15,width=12,height=13]
-DONE: Sort by area (in descending order) ---
Sort check PASSED.
---- Sort by closest to java.awt.Point[x=50,y=50] ---
9.513148795220223 java.awt.Rectangle[x=50,y=45,width=19,height=11]
...
56.923193866823745 java.awt.Rectangle[x=0,y=0,width=20,height=19]
-DONE: Sort by closest to java.awt.Point[x=50,y=50] ---
Sort check PASSED.
---- Sort by closest to java.awt.Point[x=0,y=0] ---
13.793114224133722 java.awt.Rectangle[x=0,y=0,width=20,height=19]
...
102.25091686630492 java.awt.Rectangle[x=60,y=70,width=19,height=10]
-DONE: Sort by closest to java.awt.Point[x=0,y=0] ---
Sort check PASSED.
提出物&提出日
-
完成プログラム
-
実行結果
-
提出目安は、
10/1410/21 です。 -
10/21 の授業中ぐらい10/24 頃に解答例を公開する予定です。- 自力で解けなかった場合は、「自分の作成したプログラム」と「自分のプログラムを正しく動作させるために必要だったプログラム部分の解説」をおこなってください。プログラム解説の際は、「各部位のプログラム文面をそのまま記載するのではなく、なぜ解答例がうまく動作するのか」を意識して説明すること。自力プログラムの完成度と、解説のクオリティで評価します。
-
遅くとも10月中に提出しましょう。