以下のステップを実行する前に,概要の 課題のデータから必要なデータをダウンロードしておいてください.
コマンドライン引数で与えられたデータ(複数可能)を読み,以下の分析結果を出力してください.
なお,データの各桁は,次の項目があり,各行には,各桁の値が記入されています.
該当しない項目は空白であったり,駐輪代が数値ではなく,無料のように書かれている場合もありますので,注意してください.
$ java ParkingAnalyzer1 parking1.csv
max: 1600, min: 5, total: 6060, average: 303.000000
$ java ParkingAnalyzer1 parking1.csv parking2.csv
max: 1600, min: 1, total: 17370, average: 190.879121
$ java ParkingAnalyzer1 # 何も引数が与えられない場合 N/A (not applicable)を出力する.
max: N/A, min: N/A, total: N/A, average: N/A
N/A (not applicable) を出力するようにしてください.コマンドライン引数で与えられたデータ(複数可能)を読み,以下の分析結果を出力してください.
ただし,以下の2つの要件を満たすようにプログラムを作成してください.
ParkingAnalyzer2.java のフィールドが4つ以下になるようにしてください.ParkingAnalyzer2.java のそれぞれのメソッドにおいても,宣言する変数が4つ以下になるようにしてください.$ java ParkingAnalyzer2 parking1.csv
収容可能台数(自転車) max: 1600 min: 5, total: 6060, average: 303.000000
駐輪代(自転車)/日 max: 400 min: 100, total: 2650, average: 176.666667
$ java ParkingAnalyzer2 parking1.csv parking3.csv
収容可能台数(自転車) max: 1721 min: 1, total: 15873, average: 244.200000
駐輪代(自転車)/日 max: 600 min: 100, total: 9200, average: 204.444444
$ java ParkingAnalyzer2 # 何も引数が与えられない場合 N/A (not applicable)を出力する.
収容可能台数(自転車) max: N/A, min: N/A, total: N/A, average: N/A
駐輪代(自転車)/日 max: N/A, min: N/A, total: N/A, average: N/A
Stats.javaを定義し,フィールドに max, min, sum,count を宣言します.
void update(Integer value)メソッドでは,max, min, sum,countを更新します.Double average() メソッドは,その時点での平均を返します(sum,countから求められます).String型を返す string メソッドを用意しておくと良いでしょう.
countが0ならば N/A を含む一行を返し,そうでなければ,適切な数値を入れた一行を返すようにすると良いでしょう.String.format で printf のように文字列を整形できます.ParkingAnalyzer2 では,データを読むときには,Statsの updateメソッドを呼び,必要な値を渡しましょう.public class Stats{
// ... 途中省略
String string(){
if(count == 0){
return "max: N/A, min: N/A, total: N/A, average: N/A";
}
return String.format("適切な文字列に置き換える");
}
}
String name = "Tamada";
String hello = String.format("Hello, %s", name);
// => hello には,"Hello, Tamada" が代入される.
与えられたデータを読み,指定された最寄駅から近い駐輪場を調べ, それらの収容可能台数(自転車),駐輪代の最大値,最小値,平均値,合計を出力してください. 各行の最寄駅の項目が与えられた文字列と一致すると,最寄駅から近いと判断してください.
上記の出力後,指定された最寄駅から近い駐輪場の一覧を出力してください. 一覧の出力には,次の項目のみを出力するようにしてください.
なお,自転車を止めるのに一番安い駐輪場にマーク(*)をつけてください.
プログラムには,2つ以上の引数が渡されます. 第1引数には,最寄駅を表す文字列,第2引数以降は駐輪場のcsvファイルです.
$ java ParkingAnalyzer3 北大路 parking1.csv
収容可能台数(自転車) max: N/A, min: N/A, total: N/A, average: N/A
駐輪代(自転車)/日 max: N/A, min: N/A, total: N/A, average: N/A
$ java ParkingAnalyzer3 北大路 parking1.csv parking2.csv parking3.csv
収容可能台数(自転車) max: 784 min: 125, total: 1069, average: 356.333333
駐輪代(自転車)/日 max: 200 min: 100, total: 300, average: 150.000000
北大路駅東駐車場,北大路,,,135.7588742,35.04504145
キタオオジタウン駐輪場,北大路,784,,135.7588037,35.04438447
今宮駐輪場,北大路,160,200,135.7580788,35.0465088
* ブーブーパーク北大路駅北駐輪場,北大路,125,100,135.7580786,35.0465132
$ java ParkingAnalyzer3 北大路
収容可能台数(自転車) max: N/A, min: N/A, total: N/A, average: N/A
駐輪代(自転車)/日 max: N/A, min: N/A, total: N/A, average: N/A
$ java ParkingAnalyzer3 parking1.csv # 最寄駅が parking1.csv として解釈される.
収容可能台数(自転車) max: N/A, min: N/A, total: N/A, average: N/A
駐輪代(自転車)/日 max: N/A, min: N/A, total: N/A, average: N/A
$ java ParkingAnalyzer3 # 何も指定しない場合はエラーメッセージ.
最寄駅が指定されていません.
Integer型の値が一致しているかは,== ではなく,Objects.equalsを利用してください.
123などの数値)との比較は ==で想定通りの結果となりますが,変数同士は参照の一致を確認する演算子として扱われます.Parking 型を用意しておくと良いでしょう.
void parse(String line) メソッドを用意しましょう.
line をコンマ(,)で分割し,適切なフィールドに代入しましょう.
無料 のような文字列を見つけたら,0に置き換えるなどすると良いでしょう.String string() メソッドを用意しましょう.
String.formatメソッドを利用すると良いでしょう.与えられたオプションを元に,与えられたデータを読み,適切な処理を行ってください.
なお,駐輪場のリストを出力するときに,出力結果が複数になる場合は,
駐輪代が一番安い駐輪場にマーク(*)をつけてください.
次のオプション解析を行ってください.
$ java ParkingAnalyzer4 --help
Usage: java ParkingAnalyzer4 [OPTIONS] <駐輪場ファイル...>
-h, --help: このメッセージを表示する.
-s, --station <駅>: 最寄駅を指定する.
-L, --latlon <緯度:経度>: 緯度経度を指定する.
-hもしくは,--helpが指定された場合は,上記のメッセージを表示してください.-sもしくは,--stationが指定された場合は,続いて最寄り駅が指定されていますので,その最寄り駅を元にステップ3と同じ結果を出力してください.*)をつけてください.-Lもしくは,--latlon が指定された場合は,このステップでは何も処理する必要はありません.
オプションの引数のみを対処してください(無視する,変数に代入するなど).$ java ParkingAnalyzer4 --help
Usage: java ParkingAnalyzer4 [OPTIONS] <駐輪場ファイル...>
-h, --help: このメッセージを表示する.
-s, --station <駅>: 最寄駅を指定する.
-L, --latlon <緯度:経度>: 緯度経度を指定する.
$ java ParkingAnalyzer4 -h # --help が指定された場合と同じ結果となる.
Usage: java ParkingAnalyzer4 [OPTIONS] <駐輪場ファイル...>
-h, --help: このメッセージを表示する.
-s, --station <駅>: 最寄駅を指定する.
-L, --latlon <緯度:経度>: 緯度経度を指定する.
$ java ParkingAnalyzer4
収容可能台数(自転車) max: N/A, min: N/A, total: N/A, average: N/A
駐輪代(自転車)/日 max: N/A, min: N/A, total: N/A, average: N/A
$ java ParkingAnalyzer4 parking1.csv
収容可能台数(自転車) max: 1600 min: 5, total: 6060, average: 303.000000
駐輪代(自転車)/日 max: 400 min: 100, total: 2650, average: 176.666667
エコステーション21七条西,七条,113,150,34.988854:135.767816
エコステーション21下京区総合庁舎駐輪場,京都,112,400,34.987544:135.755342
京阪六地蔵駅自転車駐車場,六地蔵,600,150,34.931797:135.793047
* ブーブーパーク西院駐輪場,西院,70,100,35.004734:135.731760
蹴上駅前駐輪場,蹴上,15,,35.007734:135.790452
エコステーション21藤森東,藤森,102,150,34.956703:135.770621
ブーブーパーク西院第4駐輪場,西院,50,150,35.004297:135.731679
桂駐輪センター,桂,147,,34.978880:135.703478
京阪納所駐輪場,淀,927,,34.906187:135.720750
* フルーツ自転車パーク京阪清水五条駅,清水五条,91,100,34.996287:135.768888
フルーツ自転車パーク祇園,祇園四条,65,150,35.004621:135.777645
京都市山科駅自転車等駐車場,山科,1600,150,34.991586:135.816507
御池通まちかど駐輪場(烏丸エリア),烏丸御池,210,,35.010979:135.758337
京都市東野駅自転車駐車場,東野,900,150,34.981369:135.816383
二条駅まちかど西駐輪場,二条,203,400,35.010810:135.740801
* フルーツ自転車パーク地下鉄五条駅,五条,60,100,34.998251:135.758071
先斗町自転車駐車場,河原町,328,150,35.005316:135.770444
京都市銀閣寺観光駐車場,京都市営バス銀閣寺道,5,200,35.026596:135.794813
京都駅八条口西自転車駐車場,京都,408,,34.984409:135.755930
エコステーション21 京都鉄道博物館Aエリア,京都,54,150,34.987491:135.743379
$ java ParkingAnalyzer4 -s 北大路 parking1.csv parking2.csv parking3.csv
収容可能台数(自転車) max: 784 min: 125, total: 1069, average: 356.333333
駐輪代(自転車)/日 max: 200 min: 100, total: 300, average: 150.000000
北大路駅東駐車場,北大路,,,135.7588742,35.04504145
キタオオジタウン駐輪場,北大路,784,,135.7588037,35.04438447
今宮駐輪場,北大路,160,200,135.7580788,35.0465088
* ブーブーパーク北大路駅北駐輪場,北大路,125,100,135.7580786,35.0465132
$ java ParkingAnalyzer4 -L 135.758079:35.046513 parking1.csv
収容可能台数(自転車) max: 1600 min: 5, total: 6060, average: 303.000000
駐輪代(自転車)/日 max: 400 min: 100, total: 2650, average: 176.666667
エコステーション21七条西,七条,113,150,34.988854:135.767816
# 途中省略(2つ上の出力と同じ)
エコステーション21 京都鉄道博物館Aエリア,京都,54,150,34.987491:135.743379
# => -L は何も処理しないので,オプションが指定されない場合と同じ結果となる
Arguments型を作成しましょう.
Boolean型の helpString型のstationString型の latlonArrayList<String> 型の argumentsvoid parse(String[] args) メソッドを用意しましょう.
-sや-Lが指定された場合は,インデックスを1つ進めて,変数に代入しましょう.void parse(String[] args){
for(Integer i = 0; i < args.length; i++){
// 途中省略
else if(/* -s もしくは --station が指定された場合の条件式 */){
i++;
this.station = args[i];
}
// 途中省略
}
}
このステップでは,ステップ4で指定できるようになったオプションのうち,-L(--latlon)の処理を実装してください.-Lの後ろには,緯度と経度がコロン(:)で区切られて指定されます.
指定された緯度経度に一番近い駐輪場を出力してください.
2つの緯度経度間の距離の求め方は後述します.
なお,-Lもしくは--latlonオプションが指定された場合,分析は,全てのデータに対して行うようにしてください.
$ java ParkingAnalyzer5 -L 35.06933197593744:135.75574524700642 parking1.csv # 京産大 14号館を指定している
収容可能台数(自転車) max: 1600 min: 5, total: 6060, average: 303.000000
駐輪代(自転車)/日 max: 400 min: 100, total: 2650, average: 176.666667
京都市銀閣寺観光駐車場,京都市営バス銀閣寺道,5,200,35.026596:135.794813
$ java ParkingAnalyzer5 -L 35.06933197593744:135.75574524700642 parking1.csv parking2.csv parking3.csv
収容可能台数(自転車) max: 1721 min: 1, total: 27183, average: 222.811475
駐輪代(自転車)/日 max: 600 min: 0, total: 17850, average: 200.561798
京都市西賀茂自転車駐車場,京都市営バス西賀茂車庫前,250,150,35.064061:135.744613
$ java ParkingAnalyzer5 parking1.csv -s 北大路 -h # --help が指定された場合と同じ結果となる.
Usage: java ParkingAnalyzer5 [OPTIONS] <駐輪場ファイル...>
-h, --help: このメッセージを表示する.
-s, --station <駅>: 最寄駅を指定する.
-L, --latlon <緯度:経度>: 緯度経度を指定する.
$ java ParkingAnalyzer5 # -L 以外を指定した場合はステップ4までと同じ結果となる.
収容可能台数(自転車) max: N/A, min: N/A, total: N/A, average: N/A
駐輪代(自転車)/日 max: N/A, min: N/A, total: N/A, average: N/A
$ java ParkingAnalyzer5 parking1.csv
収容可能台数(自転車) max: 1600 min: 5, total: 6060, average: 303.000000
駐輪代(自転車)/日 max: 400 min: 100, total: 2650, average: 176.666667
エコステーション21七条西,七条,113,150,34.988854:135.767816
# 途中省略(ステップ4の出力と同じ)
エコステーション21 京都鉄道博物館Aエリア,京都,54,150,34.987491:135.743379
$ java ParkingAnalyzer5 -s 北山 parking?.csv
収容可能台数(自転車) max: 600 min: 100, total: 700, average: 350.000000
駐輪代(自転車)/日 max: 150 min: 150, total: 150, average: 150.000000
* 京都市高速鉄道北山駅自転車駐車場,北山,600,150,35.051131:135.765208
GATO.D.M北山第一駐輪場,北山,100,,35.051241:135.767505
大きくヒュベニの公式,球面三角法,測地線航海算法の3つの方法がありますが, ここでは,計算式が簡単な球面三角法について述べます. より詳細な説明は,それぞれの計算方法を検索して調べてみてください.
例えば次の場合を考えます.
Math.acos で求められます.Math.sin,Math.cosで求められます.LatLon を作成しましょう.
Double型のフィールド latitude(緯度),longitude(経度)を用意しましょう.void parse(String latlon)メソッドで,緯度:経度 で与えられた緯度経度を解析して,フィールドに代入しましょう.Double distance(LatLon latlon) メソッドで,this と引数の latlon間の距離を計算しましょう.なお,parking1.csvなどの各行の最後は,経度,緯度の順序であることに注意してください.
結果を保存するオプション -o,--output を追加してください.
また,出力するリストにある駐車場間の距離を求めて出力する -d,distanceオプションも追加してください.
Usage: java ParkingAnalyzer6 [OPTIONS] <駐輪場ファイル...>
-h, --help: このメッセージを表示する.
-s, --station <駅>: 最寄駅を指定する.
-L, --latlon <緯度:経度>: 緯度経度を指定する.
-o, --output <FILE>: 結果を保存する.
-d, --distance <FILE>: 駐車場リスト間の距離をcsvで出力する.
結果を保存するオプションが指定された場合,標準出力には何も表示させず,指定されたファイルに書き出すようにしてください.
なお,上記のヘルプメッセージは,outputオプションを無視してください.
$ java ParkingAnalyzer6
収容可能台数(自転車) max: N/A, min: N/A, total: N/A, average: N/A
駐輪代(自転車)/日 max: N/A, min: N/A, total: N/A, average: N/A
$ java ParkingAnalyzer6 --output dest parking1.csv
$ cat dest
収容可能台数(自転車) max: 1600 min: 5, total: 6060, average: 303.000000
駐輪代(自転車)/日 max: 400 min: 100, total: 2650, average: 176.666667
$ java ParkingAnalyzer6 --output dest --help
Usage: java ParkingAnalyzer6 [OPTIONS] <駐輪場ファイル...>
-h, --help: このメッセージを表示する.
-s, --station <駅>: 最寄駅を指定する.
-L, --latlon <緯度:経度>: 緯度経度を指定する.
-o, --output <FILE>: 結果を保存する.
-d, --distance <FILE>: 駐車場間の距離をcsvで出力する.
$ java ParkingAnalyzer6 --output dest.csv parking1.csv --distance distance.csv
$ cat distance.csv # 実際には1駐輪場が1行で出力される.
エコステーション21七条西,0.000000,
エコステーション21下京区総合庁舎駐輪場,1.146916,0.000000,
京阪六地蔵駅自転車駐車場,6.755791,7.095364,0.000000,
ブーブーパーク西院駐輪場,3.733021,2.878563,9.857946,0.000000,
蹴上駅前駐輪場,2.945857,3.911787,8.456576,5.361950,0.000000,
... 途中省略
エコステーション21 京都鉄道博物館Aエリア,2.233822,1.091078,7.679255,2.192455,4.848133,4.233392,2.153666,3.763319,9.283261,2.523967,3.660690,6.684780,2.949053,6.693068,2.606437,1.797200,3.166809,6.398749,1.195024,0.000000,
$ cat dest.csv
収容可能台数(自転車) max: 1600 min: 5, total: 6060, average: 303.000000
駐輪代(自転車)/日 max: 400 min: 100, total: 2650, average: 176.666667
エコステーション21七条西,七条,113,150,34.988854:135.767816
# 途中省略(ステップ4の出力と同じ)
エコステーション21 京都鉄道博物館Aエリア,京都,54,150,34.987491:135.743379
$ java ParkingAnalyzer6 parking1.csv --distance distance.csv parking3.csv --station 北大路
収容可能台数(自転車) max: 784 min: 125, total: 1069, average: 356.333333
駐輪代(自転車)/日 max: 200 min: 100, total: 300, average: 150.000000
キタオオジタウン駐輪場,北大路,784,,35.044384:135.758804
今宮駐輪場,北大路,160,200,35.046509:135.758079
* ブーブーパーク北大路駅北駐輪場,北大路,125,100,35.046513:135.758079
$ cat distance.csv # 北大路に近い駐車場間の距離
キタオオジタウン駐輪場,0.000000,
今宮駐輪場,0.245534,0.000000,
ブーブーパーク北大路駅北駐輪場,0.246011,0.000485,0.000000,
Arguments型に対して,以下の処理を行いましょう.
String型のoutputを宣言してください.PrintWriter型のoutを宣言してください.初期値は代入しなくて良いです.Arguments型のparseメソッド)にて,出力先を Argumentsの outputに代入するようにしてください.PrintWriterを返す writerメソッドを用意しましょう.
outに何も代入されていなければ(nullであれば),次の処理を行ってください.
outputに文字が代入されていれば,そのファイルを開き PrintWriter型でラップして,outに代入しましょう.
out = new PrintWriter(new FileWriter(output));output に文字が代入されていなければ,System.outをPrintWriter型でラップしてoutに代入しましょう.
out = new PrintWriter(System.out);outを return してください.closeメソッドを用意しましょう.引数,返り値はありません.
outに値が代入されていれば(nullでなければ),closeしてください.System.out.printfを呼び出していたところを,Argumentsの実体に対して,writerメソッドを呼び出してください.
System.out.println -> arguments.writer().printlnarguments.close() を呼び出して出力ストリームを閉じてください.各駐輪場間の距離を求められれば,多次元尺度構成法(MDS; Multi-Dimendional Scaling)によって,地図にマッピングが可能になります. こちらのページでマッピングを確認できます.
parking1.csvに記載されている駐輪場間の距離を求めたものは, distance.csvからダウンロードできます. このファイルの内容をMDSでマッピングすると, このような画像になります.
一番下の駐輪場が桂駐輪センター,その上の2つ重なっている点が,ブーブーパーク西院駐輪場とブーブーパーク西院第4駐輪場です. つまり,左が北を指すようにプロットされていることがわかります.