回答編集履歴

5

追記

2024/12/14 01:24

投稿

jimbe
jimbe

スコア13235

test CHANGED
@@ -4,6 +4,9 @@
4
4
  折角フィールドを private にしているのにメソッドでまんま参照が得られてしまっては public フィールドと変わりません。
5
5
 
6
6
  それと、 Scanner の nextInt が InputMismatchException を発した時のその後の Scanner の処理は大丈夫でしょうか?
7
+ ついでに、同じ元から複数の Scanner を作るのは止めたほうが良いです。
8
+
9
+ 読み易さ的には、クラス名も Main とか Front のような何なのか役割が分からないとか、 StudentScore と StudentsScore みたいに 1 文字しか違わないパッと見間違えそうなのは止めたほうが良いと思います。
7
10
 
8
11
  まぁ兎にも角にも私好みにザーっと(過不足もあり)
9
12
  ```java

4

修正

2024/12/12 23:41

投稿

jimbe
jimbe

スコア13235

test CHANGED
@@ -3,7 +3,7 @@
3
3
  一番の問題は冗長でも可読性でもなくカプセル化が出来ていないことに思います。
4
4
  折角フィールドを private にしているのにメソッドでまんま参照が得られてしまっては public フィールドと変わりません。
5
5
 
6
- それと、 Scanner の nextInt が InputMismatchException を発した時のその後の処理は大丈夫でしょうか?
6
+ それと、 Scanner の nextInt が InputMismatchException を発した時のその後の Scanner の処理は大丈夫でしょうか?
7
7
 
8
8
  まぁ兎にも角にも私好みにザーっと(過不足もあり)
9
9
  ```java

3

追記

2024/12/12 23:28

投稿

jimbe
jimbe

スコア13235

test CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  一番の問題は冗長でも可読性でもなくカプセル化が出来ていないことに思います。
4
4
  折角フィールドを private にしているのにメソッドでまんま参照が得られてしまっては public フィールドと変わりません。
5
+
6
+ それと、 Scanner の nextInt が InputMismatchException を発した時のその後の処理は大丈夫でしょうか?
5
7
 
6
8
  まぁ兎にも角にも私好みにザーっと(過不足もあり)
7
9
  ```java

2

追記

2024/12/12 15:38

投稿

jimbe
jimbe

スコア13235

test CHANGED
@@ -1,4 +1,7 @@
1
1
  年齢はどうなったんでしょうか。
2
+
3
+ 一番の問題は冗長でも可読性でもなくカプセル化が出来ていないことに思います。
4
+ 折角フィールドを private にしているのにメソッドでまんま参照が得られてしまっては public フィールドと変わりません。
2
5
 
3
6
  まぁ兎にも角にも私好みにザーっと(過不足もあり)
4
7
  ```java

1

コード追加

2024/12/12 14:56

投稿

jimbe
jimbe

スコア13235

test CHANGED
@@ -1 +1,190 @@
1
1
  年齢はどうなったんでしょうか。
2
+
3
+ まぁ兎にも角にも私好みにザーっと(過不足もあり)
4
+ ```java
5
+ import java.util.*;
6
+ import java.util.function.BiConsumer;
7
+
8
+ public class StudentsScorer {
9
+ public static void main(String[] args) {
10
+ new StudentsScorer(new Scanner(System.in)).execute();
11
+ }
12
+
13
+ private static BiConsumer<String,Integer> SCORE_PRINTER =
14
+ (subject,score) -> System.out.println(" -" + subject + " : " + score);
15
+ private static BiConsumer<Integer,String> LIST_PRINTER =
16
+ (id,name) -> System.out.println(" - " + name + " : " + id);
17
+
18
+ private Scorer scorer = new Scorer();
19
+ private Scanner sc;
20
+
21
+ StudentsScorer(Scanner sc) {
22
+ this.sc = sc;
23
+ }
24
+
25
+ void execute() {
26
+ while(true) {
27
+ String ans = inputString(
28
+ "---------------------------------\n" +
29
+ "MENU\n" +
30
+ " 1: add student and their score\n" +
31
+ " 2: delete student info\n" +
32
+ " 3: find student based on id\n" +
33
+ " 4: list all student\n" +
34
+ "any: end");
35
+ switch (ans) {
36
+ case "1":
37
+ add();
38
+ break;
39
+ case "2":
40
+ delete();
41
+ break;
42
+ case "3":
43
+ find();
44
+ break;
45
+ case "4":
46
+ list();
47
+ break;
48
+ default:
49
+ return;
50
+ }
51
+ }
52
+ }
53
+
54
+ private void add() {
55
+ String name = inputString("Put name");
56
+ System.out.println("The name is " + name + ".");
57
+ Student student = new Student(name);
58
+
59
+ int id = scorer.regist(student);
60
+ System.out.println("Your ID is " + id + ".");
61
+
62
+ while (true) {
63
+ try {
64
+ String subject = inputString("what's subject?");
65
+ int score = inputInt("what's score?");
66
+ student.putScore(subject, score);
67
+ } catch (NumberFormatException e) {
68
+ System.out.println("** Invalid score **");
69
+ }
70
+
71
+ student.putScoresTo(SCORE_PRINTER);
72
+ String ans = inputString("continue? y/n");
73
+ if (!ans.equals("y")) break;
74
+ }
75
+
76
+ if (student.countScores() == 0) {
77
+ scorer.delete(id);
78
+ }
79
+ }
80
+
81
+ private void delete() {
82
+ try {
83
+ int id = inputInt("type ID");
84
+ Student student = scorer.find(id);
85
+
86
+ System.out.println("ID is " + id + ",");
87
+ System.out.println("this student is " + student.name + ".");
88
+
89
+ String ans = inputString("do you delete this info? y/n");
90
+ if (ans.equals("y")) {
91
+ scorer.delete(id);
92
+ System.out.println("Successfully deleted.");
93
+ } else {
94
+ System.out.println("you said no -> back to menu.");
95
+ }
96
+
97
+ } catch (NumberFormatException|NotFoundException e) {
98
+ System.out.println("** Invalid ID **");
99
+ }
100
+ }
101
+
102
+ private void find() {
103
+ try {
104
+ int id = inputInt("type ID");
105
+ Student student = scorer.find(id);
106
+
107
+ System.out.println("you are " + student.name + ".");
108
+ System.out.println("your ID is " + id + ".");
109
+ System.out.println("and your score :");
110
+ student.putScoresTo(SCORE_PRINTER);
111
+
112
+ } catch (NumberFormatException|NotFoundException e) {
113
+ System.out.println("** Invalid ID **");
114
+ }
115
+ }
116
+
117
+ private void list() {
118
+ System.out.println("this is the list :");
119
+ scorer.putListTo(LIST_PRINTER);
120
+ }
121
+
122
+ private String inputString(String prompt) {
123
+ System.out.print(prompt + ": ");
124
+ return sc.nextLine();
125
+ }
126
+
127
+ private int inputInt(String prompt) throws NumberFormatException {
128
+ System.out.print(prompt + ": ");
129
+ return Integer.parseInt(sc.nextLine());
130
+ }
131
+ }
132
+
133
+ class NotFoundException extends RuntimeException {
134
+ public NotFoundException(String message) {
135
+ super(message);
136
+ }
137
+ }
138
+
139
+ class Scorer {
140
+ private final Map<Integer,Student> studentMap = new HashMap<>();
141
+ private final Random random = new Random();
142
+
143
+ int regist(Student student) {
144
+ int id = generateId();
145
+ studentMap.put(id, student);
146
+ return id;
147
+ }
148
+
149
+ Student find(int id) throws NotFoundException {
150
+ if (!studentMap.containsKey(id)) throw new NotFoundException("id=" + id);
151
+ return studentMap.get(id);
152
+ }
153
+
154
+ void delete(int id) {
155
+ studentMap.remove(id);
156
+ }
157
+
158
+ void putListTo(BiConsumer<Integer,String> consumer) {
159
+ studentMap.entrySet().stream().forEach(e -> consumer.accept(e.getKey(), e.getValue().name));
160
+ }
161
+
162
+ private int generateId() {
163
+ while (true) {
164
+ int id = random.nextInt(10000);
165
+ if (!studentMap.containsKey(id)) return id;
166
+ }
167
+ }
168
+ }
169
+
170
+ class Student {
171
+ final String name;
172
+ private final Map<String,Integer> scoreMap = new HashMap<>();
173
+
174
+ Student(String name) {
175
+ this.name = name;
176
+ }
177
+
178
+ void putScore(String subject, int score) {
179
+ scoreMap.put(subject, score);
180
+ }
181
+
182
+ int countScores() {
183
+ return scoreMap.size();
184
+ }
185
+
186
+ void putScoresTo(BiConsumer<String,Integer> consumer) {
187
+ scoreMap.entrySet().stream().forEach(e -> consumer.accept(e.getKey(), e.getValue()));
188
+ }
189
+ }
190
+ ```