Javaでキャンプ割り勘アプリを作成しよう。
csvファイルからデータを読み込み。キャンプにかかった費用や個人の支払いなどを計算する。
詳しくは実行例を参考のこと。
なお、お買い物をしていない参加メンバーはいないものとする。
csvファイルを以下からダウンロードし、ファイルを読み込みながら処理をしていく。
その際必要となる例外処理は今回省略してよい。
(mainメソッドにthrows Exception)
注)出力の際の順序は任意でよい
実行例
[実行例]
csvデータ
------------------
山田,ビール,4600
田中,ガソリン,5200
鈴木,駐車場,2500
田中,食材,6000
鈴木,ガソリン,2000
大野,食材,2400
山田,キャンプ場,10000
キャンプ会計
------------------
食材:8400
ガソリン:7200
駐車場:2500
ビール:4600
キャンプ場:10000
個人別会計(1人あたり:8175円)
------------------
田中:+3025
山田:+6425
鈴木:-3675
大野:-5775
作成
ファイルの読み込みをしてみよう。
Javaには様々なファイル読み込み方法が提供されているが以下の方法を覚えておくのがベストだ。
BufferedReader インスタンス作成
FileInputStream fis = new FileInputStream("data.csv");
InputStreamReader isr=new InputStreamReader(fis,"utf8");
BufferedReader br=new BufferedReader(isr);
まず引数にファイルパスを渡してFileInputStreamインスタンスを作成する。
ただ、このままでは読み込み効率が悪いのでInputStreamReaderインスタンスでラップする。この際第2引数で文字コードを指定できるので様々な文字コードのファイルを読み込むことができる。そして最後はBufferdReaderでラップする。
こうすることで最大効率で読み込みを行うことができる。
ファイルを1行ずつ行がなくなるまで読み込む
String line;
while((line=br.readLine()) != null){
System.out.println(line);
}
BufferedReader インスタンスのbrがreadLine()することで1行を読み込むことができる。それを変数lineに代入し、whileブロックの中で利用している。
行末まで達するとlineにnullが入るのでwhile文を抜けるという仕組みだ。
ファイルの読み込み方も復数あるがこの方法がベストなので公式としてしっかりと覚えてしまおう。
メインメソッド
今回の主役は[名前と金額]と[アイテム名と金額]のkeyValuePairをもつ2つのMapだ。
ファイルから1行1行読み込む際にこの2つのMapにデータを格納していけば良さそうだ。
import java.io.*;
import java.util.*;
public class CampApp{
public static void main(String[] args) throws Exception{
FileInputStream fis = new FileInputStream("data.csv");
InputStreamReader isr=new InputStreamReader(fis,"utf8");
BufferedReader br=new BufferedReader(isr);
Map<String,Integer> names=new HashMap<>();
Map<String,Integer> items=new HashMap<>();
int total=0;
System.out.println("csvデータ");
System.out.println("------------------");
String line;
while((line=br.readLine())!=null){
System.out.println(line);
String[] data=line.split(",");
String name=data[0];
String item=data[1];
int price=Integer.parseInt(data[2]);
total+=price;
if(names.containsKey(name)){
names.put(name,names.get(name)+price);
}else{
names.put(name,price);
}
if(items.containsKey(item)){
items.put(item,items.get(item)+price);
}else{
items.put(item,price);
}
}
System.out.println("\nキャンプ会計");
System.out.println("------------------");
for(String item:items.keySet()){
System.out.println(item+":"+items.get(item));
}
int perYen=total/names.size();
System.out.println("\n個人別会計(1人あたり:"+perYen+"円)");
System.out.println("------------------");
for(String name:names.keySet()){
System.out.printf("%s:%s%d%n",name,names.get(name) < perYen ? "-":"+",Math.abs(names.get(name)-perYen) );
}
}
}
1行読みこんだ後にカンマでsplitして配列に変換することがわかればそんなに難しい処理はないだろう。今回はファイルの読み込みの流れを理解することを重視したので例外処理は省略したが、実際の業務ではファイルの読み書きの際にはキッチリと例外処理を行う必要があることも覚えておこう。
コメント