以下のステップを実行する前に,概要の 課題のデータから必要なデータをダウンロードしておいてください.
コマンドライン引数で与えられたデータ(複数可能)を読み,以下の分析結果を出力してください.
なお,データの各桁は,次の項目があり,各行には,各桁の値が記入されています.
該当しない項目は空白であったり,駐輪代が数値ではなく,無料
のように書かれている場合もありますので,注意してください.
$ 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
型の help
String
型のstation
String
型の latlon
ArrayList<String>
型の arguments
void 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().println
arguments.close()
を呼び出して出力ストリームを閉じてください.各駐輪場間の距離を求められれば,多次元尺度構成法(MDS; Multi-Dimendional Scaling)によって,地図にマッピングが可能になります. こちらのページでマッピングを確認できます.
parking1.csvに記載されている駐輪場間の距離を求めたものは, distance.csvからダウンロードできます. このファイルの内容をMDSでマッピングすると, このような画像になります.
一番下の駐輪場が桂駐輪センター,その上の2つ重なっている点が,ブーブーパーク西院駐輪場とブーブーパーク西院第4駐輪場です. つまり,左が北を指すようにプロットされていることがわかります.