前提・実現したいこと
以下の参考資料に記載されているコードを元に
Javaのオブジェクト指向で書かれたプログラムで
csvファイルを読み込み形式を変更した上で新たなcsvファイルを書き出そうとしています。
また同時に連想配列HashMapを操作し、車種とその個数のデータを更新します。
以下excelですが、csv形式にしたファイルを読み書きします。
発生している問題・エラーメッセージ
以下のCSVInandOutクラスを実行すると以下のように表示されます。
Carクラスのコンストラクタが呼びだされました Categoryクラスのコンストラクタが呼びだされました Carクラスのコンストラクタが呼びだされました Categoryクラスのコンストラクタが呼びだされました Carクラスのコンストラクタが呼びだされました Categoryクラスのコンストラクタが呼びだされました Carクラスのコンストラクタが呼びだされました Categoryクラスのコンストラクタが呼びだされました
現状のコードでは
Carクラスのコンストラクタだけではなく、連想配列car_mapを操作する
Categoryクラスのコンストラクタが呼びだされていますが、
HashMap<String, Integer> car_map = new HashMap<String, Integer>();
で定義した連想配列car_mapの値が以下のように正しく入力されているか(出力形式は正しくないかもしれませんが、以下のことを知りたいです)
car_map = {[キー:軽自動車]:2, [キー:普通自動車]:1, [キー:小型自動車]:1}
コードをどのように修正することで確認できますでしょうか。
また、現状ではcar_mapにデータが入っていない場合、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
CSVInandOutクラス(csvの入出力を行う)
import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; public class CSVInandOut { public static void main(String[] args) { List<Car> carList = new ArrayList<Car>(); //データ格納用リスト String input = "carIn.csv"; String output = "carOut.csv"; try { BufferedReader InputLine = new BufferedReader(new FileReader(input)); PrintWriter outputLine = new PrintWriter(new FileWriter(output)); String line; line = InputLine.readLine(); //ヘッダの読み書き outputLine.println(line); //1行ずつ読み込み while ((line = InputLine.readLine()) != null) { //String変数lineに格納 StringTokenizer st = new StringTokenizer(line); //lineを分割の対象にする //フィールドの設定を行う String name = st.nextToken(","); String company = st.nextToken(","); String catname = st.nextToken(","); carList.add(new Car(name, company, catname)); //リストに追加する Category category = new Category(catname,1); // この行を追加 } //carListの中身を順に出力する for (Car car : carList) { outputLine.print(car.name + ","); outputLine.print(car.company+ ","); outputLine.print(car.catname); outputLine.println(); } //開いていた出入力ファイルを閉じる InputLine.close(); outputLine.close(); } catch (IOException e) { System.out.println("ファイルが開けません"); } } }
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
CategoryWorkクラスを使って連想配列car_mapの値を追加することはできました。
補足情報(FW/ツールのバージョンなど)
clipse 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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/05/27 06:02
退会済みユーザー
2018/05/27 06:05
退会済みユーザー
2018/05/27 10:53