回答編集履歴

3

Listなのに配列の書き方が残ってた

2017/10/08 00:39

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -190,7 +190,7 @@
190
190
 
191
191
  int num = kbd.nextInt();
192
192
 
193
- table[count] = new Town(p, n, num);
193
+ table.add(new Town(p, n, num));
194
194
 
195
195
  }
196
196
 

2

ラムダやストリームを使いまくった参考コード

2017/10/08 00:39

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -131,3 +131,91 @@
131
131
  }
132
132
 
133
133
  ```
134
+
135
+
136
+
137
+ ###参考コード(動作未検証)
138
+
139
+ ```java
140
+
141
+ class Town {
142
+
143
+ String pref;
144
+
145
+ String name;
146
+
147
+ int population;
148
+
149
+
150
+
151
+ public Town(String p, String n, int pop) {
152
+
153
+ pref = p;
154
+
155
+ name = n;
156
+
157
+ population = pop;
158
+
159
+ }
160
+
161
+
162
+
163
+ @Override
164
+
165
+ public String toString() {
166
+
167
+ return "県 : " + pref + ": 市町村 :" + name + " : 人口 : " + population;
168
+
169
+ }
170
+
171
+ }
172
+
173
+
174
+
175
+ public class Population {
176
+
177
+ public static void main(String args[]) {
178
+
179
+ Scanner kbd = new Scanner(System.in);
180
+
181
+ List<Town> table = new ArrayList<>();
182
+
183
+
184
+
185
+ while(kbd.hasNext()) {
186
+
187
+ String p = kbd.next();
188
+
189
+ String n = kbd.next();
190
+
191
+ int num = kbd.nextInt();
192
+
193
+ table[count] = new Town(p, n, num);
194
+
195
+ }
196
+
197
+
198
+
199
+ Comparator<Town> comparator = Comparator.comparingInt(t -> t.population))
200
+
201
+
202
+
203
+ Collections.sort(table, comparator);
204
+
205
+ System.out.println("中央: " + table.get((table.size() - 1) / 2));
206
+
207
+ System.out.println("人口平均値: " + table.stream().mapToInt(t -> t.population).average().orElse(0.0));
208
+
209
+ table.stream().max(comparator).ifPresent(t -> System.out.println("人口最大: " + t));
210
+
211
+ table.stream().min(comparator).ifPresent(t -> System.out.println("人口最小: " + t));
212
+
213
+ }
214
+
215
+
216
+
217
+
218
+
219
+ }
220
+
221
+ ```

1

大雑把なコード修正

2017/10/07 18:09

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -14,6 +14,120 @@
14
14
 
15
15
  ```
16
16
 
17
+ 最大に関しては
18
+
19
+ ```java
20
+
21
+ for(int i=0; i>t.length; i++) {
22
+
23
+ System.out.println("人口が最大の市町村は  県 : "+t[num-1].pref+": 市町村 :"+t[num-1].name+" : 人口 : "+t[num-1].population);
24
+
25
+ break;
26
+
27
+ ```
28
+
29
+ iが0から始まって、t.lengthは2000(それ以外でも0以上であることは確実)なので、for文の継続条件を最初から満たさず、for文の中に入ることができません。それ以前にfor文の存在が無意味です。
17
30
 
18
31
 
32
+
33
+ ###コード修正
34
+
35
+ #####Townクラス
36
+
37
+ まずTownはコンストラクタを用意して、必要なパラメータをまとめて設定しましょう。
38
+
39
+ また、Townのデータを出力する箇所がいくつかありますが、全部同じ形式です。こういうものこそTownのメソッドとして用意しましょう。ObjectクラスのtoString()メソッドをオーバーライドすれば、出力が簡単になります。
40
+
41
+ ```java
42
+
43
+ class Town {
44
+
45
+ String pref;
46
+
47
+ String name;
48
+
49
+ int population;
50
+
51
+
52
+
53
+ public Town(String p, String n, int pop) {
54
+
55
+ pref = p;
56
+
57
+ name = n;
58
+
59
+ population = pop;
60
+
61
+ }
62
+
63
+
64
+
65
+ @Override
66
+
67
+ public String toString() {
68
+
69
+ return "県 : " + pref + ": 市町村 :" + name + " : 人口 : " + population;
70
+
71
+ }
72
+
73
+ }
74
+
75
+
76
+
77
+ // 例えばMiddleの出力はこうできる
78
+
79
+ System.out.println(t[(num-1)/2]);
80
+
81
+ ```
82
+
83
+
84
+
85
+ #####要素数が決まっていないなら配列よりList
86
+
87
+ 要素数が決まっていないなら配列を使用するには向いていません。Listを使えばnumという変数は不要になります。課題などで配列限定なら仕方ないですが。
88
+
89
+ #####メソッドについて
90
+
91
+ メソッドはその役割だけを担うようにするべきです。sortはソートのみやるべきで、平均の出力をそのあとにやるということをこのメソッドが担当するべきではありません。
92
+
19
- コーが全体的ひどいので、帰ってから追記しま
93
+ また、メソッ名は小文字始まりにしましょう
94
+
95
+ ```java
96
+
97
+ public static void main(String args[]) {
98
+
99
+ Scanner kbd = new Scanner(System.in);
100
+
101
+ Town[] table = new Town[2000];
102
+
103
+ int count;
104
+
105
+
106
+
107
+ for(count = 0; kbd.hasNext() && count < 2000; count++) {
108
+
109
+ String p = kbd.next();
110
+
111
+ String n = kbd.next();
112
+
113
+ int num = kbd.nextInt();
114
+
115
+ table[count] = new Town(p, n, num);
116
+
117
+ }
118
+
119
+
120
+
121
+ sort(table, count);
122
+
123
+ middle(table, count);
124
+
125
+ average(table, count);
126
+
127
+
128
+
129
+
130
+
131
+ }
132
+
133
+ ```