teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

コードの追加

2020/05/09 13:12

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -20,4 +20,127 @@
20
20
  result の宣言はどこにありますか?
21
21
 
22
22
  すべての質問に答えてください。
23
- 分からなければ、何が分からないのかを詳しく書いてください。
23
+ 分からなければ、何が分からないのかを詳しく書いてください。
24
+
25
+ 質問に多くの人からアドバイスをもらってもそれに応えないのは
26
+ かなり混乱しているからでしょう。
27
+
28
+ ではアプローチを変えてみます。
29
+ 次のコードは思った通りに動きますか?
30
+ この問いになら返答できるでしょう。
31
+
32
+ ```Java
33
+ import java.io.*;
34
+ import java.util.*;
35
+
36
+ class Subject {
37
+ private String name;
38
+ private int score;
39
+
40
+ public Subject(String name, int score) {
41
+ this.name = name; this.score = score;
42
+ }
43
+
44
+ public String getName() { return name; }
45
+ public int getScore() { return score; }
46
+ }
47
+
48
+ class Student {
49
+ private String room;
50
+ private String name;
51
+ private List<Subject> subjects = new ArrayList<Subject>();
52
+
53
+ public Student(String room, String name) {
54
+ this.room = room; this.name = name;
55
+ }
56
+
57
+ public void add(Subject subject) { subjects.add(subject); }
58
+
59
+ public boolean equals(Object o) {
60
+ Student st = (Student)o;
61
+ return name.equals(st.name);
62
+ }
63
+
64
+ public int calcSum(){
65
+ int sum = 0;
66
+ for (Subject sj : subjects) sum += sj.getScore();
67
+ return sum;
68
+ }
69
+
70
+ public int subjectCount() { return subjects.size(); }
71
+
72
+ public String getRoom() { return room; }
73
+ public String getName() { return name; }
74
+ public List<Subject> getSubjects() { return subjects; }
75
+ }
76
+
77
+ // 読み取りクラス
78
+ class DataReader {
79
+ private List<Student> data_a = new ArrayList<Student>();
80
+
81
+ public List<Student> getData() { return data_a; }
82
+
83
+ public void readCsv() {
84
+ File fl = new File("testdata");
85
+ try (FileReader fr = new FileReader(fl);
86
+ BufferedReader in = new BufferedReader(fr)) {
87
+
88
+ String line;
89
+ while ((line = in.readLine()) != null) {
90
+ String[] data_s = line.split(",");
91
+ Student st = new Student(data_s[0], data_s[1]);
92
+ Subject sj = new Subject(data_s[2], Integer.valueOf(data_s[3]));
93
+ int i = data_a.indexOf(st);
94
+ if (i >= 0)
95
+ data_a.get(i).add(sj);
96
+ else {
97
+ st.add(sj);
98
+ data_a.add(st);
99
+ }
100
+ }
101
+ } catch (IOException ex) {
102
+ ex.printStackTrace();
103
+ }
104
+ }
105
+ public void showData() {
106
+ for (Student st : data_a) {
107
+ System.out.print(st.getRoom() + " " + st.getName() + ":");
108
+ List<Subject> subjects = st.getSubjects();
109
+ for (Subject sj : subjects)
110
+ System.out.print(" " + sj.getName() + ":" + sj.getScore());
111
+ System.out.println();
112
+ }
113
+ }
114
+
115
+ public void calcData() {
116
+ for (Student st : data_a) {
117
+ int sum = st.calcSum();
118
+ double ave = (double)sum / st.subjectCount();
119
+ System.out.println(st.getName() + ", 合計点:" + sum + ", 平均点:" + ave);
120
+ }
121
+ }
122
+ }
123
+
124
+ class Main {
125
+ public static void main(String[] args) {
126
+ DataReader reader = new DataReader();
127
+ reader.readCsv();
128
+ reader.showData();
129
+ reader.calcData();
130
+ }
131
+ }
132
+ ```
133
+ このコードは一つの例であり、質問者の要求に完全に一致するものではない
134
+ かもしれません。これを参考に自分のコードが書けるようになってほしいのです。
135
+
136
+ 回答にコードをもらった人の中には、「できました」とか「解決しました」と
137
+ いう言葉を残して去っていく人がいます。
138
+ 本当に内容を理解したのでしょうか?
139
+ そうでなければ、何の解決にもなりません。
140
+
141
+ とにかく動くコードが得られたのですから、文がどの順番に実行され、
142
+ 変数がどのように変化するのかを追っていかなければなりません。
143
+ 分からないところがあればそれを調査し、それでも分からなければ
144
+ どんどん質問しましょう。
145
+
146
+ 回答へのコメントをお願いします。