前提・実現したいこと
ここに質問の内容を詳しく書いてください。
以下の参考資料に記載されているコードを元に
Javaのオブジェクト指向で書かれたプログラムで
csvファイルを読み込み形式を変更した上で新たなcsvファイルを書き出そうとしています。
以下excelですが、csv形式にしたファイルを読み書きします。
発生している問題・エラーメッセージ
現状のコード(CarクラスとCSVInandOutクラス)では、csvファイルの読み書きは問題なく行われます。
これに加え、車種の辞書型データ(JavaではHashMap)に関する実装をCSVInandOutクラスに加えようとしています。
csvで読み込んだ車種(catname)が辞書になければ、カテゴリーのインスタンスが作成され、
辞書内に同じ車種(Key)があればそのKey値である個数(num)を1増やすということを
CSVInandOutクラスの中で行おうとしています。
これらを実現するために、現状のコードをどのように組み合わせたら良いか
教えていただきたいです。
該当のソースコード
Carクラス
Java
1public class Car { 2 String name; //車名 3 String company; //メーカー 4 String catname; //車種 5 6 //Carクラスに追加したコンストラクタ 7 Car(String name, String company, String catname){ 8 System.out.println("Carクラスのコンストラクタが呼びだされました"); 9 this.name = name; 10 this.company = company; 11 this.catname = catname; 12 } 13 14 15} 16
CSVInandOutクラス(csvの入出力を行う)
Java
1import java.io.BufferedReader; 2import java.io.FileReader; 3import java.io.FileWriter; 4import java.io.IOException; 5import java.io.PrintWriter; 6import java.util.ArrayList; 7import java.util.List; 8import java.util.StringTokenizer; 9 10public class CSVInandOut { 11 public static void main(String[] args) { 12 List<Car> carList = new ArrayList<Car>(); //データ格納用リスト 13 String input = "carIn.csv"; 14 String output = "carOut.csv"; 15 16 try { 17 BufferedReader InputLine = new BufferedReader(new FileReader(input)); 18 PrintWriter outputLine = new PrintWriter(new FileWriter(output)); 19 String line; 20 21 line = InputLine.readLine(); //ヘッダの読み書き 22 outputLine.println(line); 23 24 //1行ずつ読み込み 25 while ((line = InputLine.readLine()) != null) { //String変数lineに格納 26 StringTokenizer st = new StringTokenizer(line); //lineを分割の対象にする 27 28 //フィールドの設定を行う 29 String name = st.nextToken(","); 30 String company = st.nextToken(","); 31 String catname = st.nextToken(","); 32 carList.add(new Car(name, company, catname)); //リストに追加する 33 } 34 35 //carListの中身を順に出力する 36 for (Car car : carList) { 37 outputLine.print(car.name + ","); 38 outputLine.print(car.company+ ","); 39 outputLine.print(car.catname); 40 outputLine.println(); 41 } 42 43 //開いていた出入力ファイルを閉じる 44 InputLine.close(); 45 outputLine.close(); 46 47 } 48 catch (IOException e) { 49 System.out.println("ファイルが開けません"); 50 } 51 } 52} 53
Categoryクラス
Java
1import java.util.HashMap; 2 3public class Category { 4 String catname; //カテゴリー名 5 int num; 6 HashMap<String, Integer> car_map = new HashMap<String, Integer>(); 7 8 //Categoryクラスに追加したコンストラクタ 9 Category(String catname, int num) { 10 System.out.println("Categoryクラスのコンストラクタが呼びだされました"); 11 this.catname = catname; 12 this.num = num; 13 } 14 15 //更新・追加 16 void add(String catname) { 17 //すでにカテゴリー名が存在すれば個数を1増やす 18 if (car_map.containsKey(catname)) { 19 increaseNum(catname, 1); 20 } else { 21 //新たなカテゴリーならkeyと値を追加 22 car_map.put(catname, 1); 23 } 24 System.out.println("[キー:トラック]:" + car_map.get(catname)); 25 } 26 27 void increaseNum(String car, int num) { 28 int new_num = this.car_map.get(car) + num; 29 this.car_map.put(car, num); //値を更新したものに置換 30 } 31} 32 33
CategoryWorkクラス(Categoryクラスの動作確認のために作成)
Java
1public class CategoryWork { 2 3 public static void main(String[] args) { 4 Category category = new Category("トラック",1); 5 category.add("トラック"); 6 } 7} 8
補足情報(FW/ツールのバージョンなど)
Eclipse Java EE IDE for Web Developers.
Version: Oxygen.3a Release (4.7.3a)
Microsoft Excel for Mac バージョン16.13
Javaバージョン(java.version):1.8.0_152
オペレーティングシステム名(os.name):Mac OS X
回答2件
あなたの回答
tips
プレビュー