前提・実現したいこと
java初学者です。
DATファイルを用いてファイル操作を行い、グループトータルという処理を行いたいです。
以下、ファイルの例です。
【点数ファイル】
A 01 MATSUMOTO 090 075 100
A 02 KAWAUCHI 100 055 080
A 03 KANBA 040 100 050
A 04 MATSUURA 030 020 010
B 01 ASANUMA 060 090 070
B 02 IBA 050 080 090
C…以降割愛
(データはHクラスまであり、30件分ほどあります。)
・データは「クラス名、出席番号、名前、英語の点数、数学の点数、国語の点数(すべて半角スペース区切り)」で、クラス名で昇順にソートされています。
・クラス別に英語、数学、国語の平均点を出したいです。
・読み込んだ1レコードを半角スペース区切りごとにspritで分割し、配列に格納した後、配列の0番目の要素であるクラス名を一時的に退避領域に退避させてから、次のレコードのクラス名と比較し、同じ場合には点数を合計し、異なる場合には合計点を人数で割り、平均点を算出し表示しようとしたのですが、アルゴリズムがわからず苦戦しています。
特に退避領域のクラス名と次のレコードのクラス名をどのように比較したらよいのかがわかりません。
どなたかご教授いただければ幸いです。
発生している問題・エラーメッセージ
[出力結果] クラス 英語 数学 国語 _________________________ A 90 75 100 A 20 50 25 B 20 30 23 B 17 25 15 C 4 20 20 C 13 11 3 D 4 9 12 D 4 2 6 D 8 11 8 E 9 1 4 E 8 9 9 F 8 4 8 G 7 7 7 H 3 4 7 H 6 2 0 (一番上のクラス 英語 数学 国語は自分で表示させています) 期待する結果は、 A 62 75 89 B 59 62 75 C 56 67 76 D … (以降割愛) 上記のように1つのクラスにつき一つの結果になるようにしたいです。
該当のソースコード
Java
1MyFileReader mfr = new MyFileReader(scoreFile); 2 3 String line; //1レコードを読み込む 4 String[] data = {}; //読み込んだレコードを格納する配列 5 6 int count = 0; //クラスの人数をカウントする 7 8 /* 主処理ループ */ 9 while((line = mfr.read()) != null) { 10 11 //1レコードデータを半角スペース区切りごとに分割し配列に格納する。 12 data = line.split(" "); 13 14 int eigo = Integer.parseInt(data[3]);//分割したレコードの英語の点数を数値型に変換 15 int suugaku = Integer.parseInt(data[4]);//分割したレコードの数学の点数を数値型に変換 16 int kokugo = Integer.parseInt(data[5]);//分割したレコードの国語の点数を数値型に変換 17 18 String taihi = data[0];//読み込んだレコードのクラス名の退避領域 19 20 int eigoSum = 0; 21 int suugakuSum = 0; 22 int kokugoSum = 0; 23 24 25 /* 集計ループ */ 26 while(line != null || !(taihi.equals(data[0]))) { 27 28 String crass = data[0]; 29 30 if(taihi.equals(crass)) { 31 32 eigoSum = eigoSum + eigo; 33 suugakuSum = suugakuSum + suugaku; 34 kokugoSum = kokugoSum + kokugo; 35 36 count = count + 1; 37 38 39 } 40 41 }//集計ループ 42 43 int eigoAve = eigoSum / count; 44 int suugakuAve = suugakuSum / count; 45 int kokugoAve = kokugoSum / count; 46 47 System.out.print(String.format("%3s ", taihi)); 48 System.out.print(String.format("%4d ", eigoAve)); 49 System.out.print(String.format("%4d ", suugakuAve)); 50 System.out.println(String.format("%4d ", kokugoAve)); 51 52 }//主処理ループ 53 54 mfr.close(); 55 56 } 57 58} 59
試したこと
比較の方法や分岐の書き方などいろいろ試してみましたが思うような結果は得られませんでした。
コードの書き方やそもそもの考え方にかなり問題があるのかもしれないのですが
どこが問題なのかも分からなくなってしまったため、困っています。
補足情報(FW/ツールのバージョンなど)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/08 02:18
2021/05/08 03:43
2021/05/08 03:52
2021/05/08 03:57
2021/05/08 04:26
2021/05/08 04:31
2021/05/08 04:39
2021/05/08 06:34
2021/05/08 06:47 編集
2021/05/08 07:05