練習問題
1. CSVデータの格納
ここでは,郵便番号から住所の検索を行うプログラムを作成します.
- 郵便番号データを用意してください.
- 郵便番号データダウンロードページから自分の出身地の郵便番号データをダウンロードしてください.
- ダウンロードしたzipファイルを解凍してください.
- 解凍してできたファイルを
zipcode.csv
にファイル名を変更してください. - ダウンロードしたファイルの文字コードは ShiftJIS になっています.utf-8 でなければJavaでは文字化けを起こしますので,変換しておいてください.
iconv
コマンドがインストールされているなら,ターミナルで次のように入力しましょう.iconv -f CP932 -t utf-8 zipcode.csv > zipcode2.csv
iconv --from-code=CP932 --to-code utf-8 zipcode.csv > zipcode2.csv
でも良い.
mv zipcode2.csv zipcode.csv
- 参考
- 各種エディタでも文字コードを変換できます.
- Emacsであれば,ファイルを開いて,
Ctrl+x RET f
と入力すると変換したい文字コードを聞かれますので,utf-8
と入力してください. - VS Codeでエンコーディングを変更、自動判別するには.
- AtomでShift-JISのCSVデータをUTF-8に変換する.
- Emacsであれば,ファイルを開いて,
- 郵便番号を読み込み,検索を行うプログラムを作成してください.
- クラス名は
ZipCode
としてください. - コマンドライン引数で与えられた郵便番号に対応する住所を出力してください.
- クラス名は
ヒント
ベースとなるプログラム
例題1. お弁当の料金表が参考になるでしょう.
初期化処理(initialize
メソッド)でzipcode.csv
を読み込み,HashMap
型の変数に
郵便番号と対応した住所を追加(put
)しましょう.
その後,検索処理を行います.検索処理はsearchAndPrint
メソッドとほぼ同じで良いでしょう.
キーとバリューそれぞれの型は何が良いかを考えて作成しましょう.
ダブルクォートの削除
ダウンロードした csv ファイルは,各カラムがダブルクォートで囲まれています.
これを削除するには,以下のメソッド(stripQuote
)を使うと良いでしょう.sampleCode
メソッド
はstripQuote
の使い方の例です.sampleCode
メソッドにあるように,split
で
得られた配列の各要素を順にstripQuote
に渡すことで,
ダブルクォートを除いた部分を取り出しています.
String stripQuote(String item){
if(item.matches("\".*\"")){
return item.substring(1, item.length() - 1);
}
return item;
}
void sampleCode(){
String original = "\"クォートで囲まれた文字列\"";
String value = this.stripQuote(original);
// originalには「"クォートで囲まれた文字列"」が代入されており,
// valueには「クォートで囲まれた文字列」が代入される.
}
なお,matches
メソッドは与えられた正規表現(Regular Expression)にマッチするかを判定するメソッドです.
出力例
$ java ZipCode 6038035 6038047 1000001
6038035: 京都市北区上賀茂朝露ケ原町
6038047: 京都市北区上賀茂本山
1000001: 見つかりませんでした
100-0001 は東京都の郵便番号ですので,京都府の郵便番号表では見つかりません. そのため,上記のように「見つかりませんでした」と出力されています.
2. 電話帳の作成
以下の仕様に従った名前と電話番号のペアを管理する電話帳を作成しましょう.
- クラス名は
PhoneBook
としてください. - 起動するとコマンド入力待ちとなります.
- 以下のコマンドを入力することによって,データの更新が行われる.
add 名前 電話番号
- 電話帳に名前と対応する電話番号を追加する.
list
- 登録された名前と電話番号の一覧を表示する.
find 名前
- 電話帳に名前が存在すれば名前と電話番号を表示する.
- 電話帳に名前が存在しなければ何も表示しない.
remove 名前
- 電話帳から名前のデータを削除する.
- 電話帳に名前のデータが存在しなければ何も行わない.
exit
- 電話帳を終了する.
- 入力において,文法エラーは起きないものとします.
- 標準入力から1行読み込むには,
SimpleConsole.java
を利用してください.SimpleConsole.java
をここからダウンロードし,プログラムと同じディレクトリに置いてください.- 入力した文字列をスペースで区切るには,
String
型のsplit
メソッドを利用しましょう.String[] items = line.split(" ");
SimpleConsole.java
は一切変更してはいけません.- 同様に,
PhoneBook.java
には,SimpleConsole.java
のコードを貼り付けてはいけません.
- 同様に,
ヒント
SimpleConsole の使い方.
SimpleConsole console = new SimpleConsole();
String line = console.readLine();
利用する前に,new
で実体を作成してください.
その後,得られた実体(上記の例では console
)に対して readLine
メソッドを呼び出すと1行読み込むことができます.
出力例
> list
> add tamada 090-1111-1111
> find tamada
tamada 090-1111-1111
> find akiyama
> add akiyama 090-2222-2222
> list
tamada 090-1111-1111
akiyama 090-2222-2222
> remove akiyama
> find akiyama
> add tamada 090-1111-2222
> list
tamada 090-1111-2222
> exit
>
で始まる行が入力を表しています.
最初は電話帳に何も入力されていないため,list
コマンドを入力しても何も出力されません.
データをadd
コマンドで追加していくことで,結果が変わってきます.