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

回答編集履歴

3

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

2017/10/08 00:39

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -94,7 +94,7 @@
94
94
  String p = kbd.next();
95
95
  String n = kbd.next();
96
96
  int num = kbd.nextInt();
97
- table[count] = new Town(p, n, num);
97
+ table.add(new Town(p, n, num));
98
98
  }
99
99
 
100
100
  Comparator<Town> comparator = Comparator.comparingInt(t -> t.population))

2

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

2017/10/08 00:39

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -64,4 +64,48 @@
64
64
 
65
65
 
66
66
  }
67
+ ```
68
+
69
+ ###参考コード(動作未検証)
70
+ ```java
71
+ class Town {
72
+ String pref;
73
+ String name;
74
+ int population;
75
+
76
+ public Town(String p, String n, int pop) {
77
+ pref = p;
78
+ name = n;
79
+ population = pop;
80
+ }
81
+
82
+ @Override
83
+ public String toString() {
84
+ return "県 : " + pref + ": 市町村 :" + name + " : 人口 : " + population;
85
+ }
86
+ }
87
+
88
+ public class Population {
89
+ public static void main(String args[]) {
90
+ Scanner kbd = new Scanner(System.in);
91
+ List<Town> table = new ArrayList<>();
92
+
93
+ while(kbd.hasNext()) {
94
+ String p = kbd.next();
95
+ String n = kbd.next();
96
+ int num = kbd.nextInt();
97
+ table[count] = new Town(p, n, num);
98
+ }
99
+
100
+ Comparator<Town> comparator = Comparator.comparingInt(t -> t.population))
101
+
102
+ Collections.sort(table, comparator);
103
+ System.out.println("中央: " + table.get((table.size() - 1) / 2));
104
+ System.out.println("人口平均値: " + table.stream().mapToInt(t -> t.population).average().orElse(0.0));
105
+ table.stream().max(comparator).ifPresent(t -> System.out.println("人口最大: " + t));
106
+ table.stream().min(comparator).ifPresent(t -> System.out.println("人口最小: " + t));
107
+ }
108
+
109
+
110
+ }
67
111
  ```

1

大雑把なコード修正

2017/10/07 18:09

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -6,5 +6,62 @@
6
6
  ```java
7
7
  total += t[i].population;
8
8
  ```
9
+ 最大に関しては
10
+ ```java
11
+ for(int i=0; i>t.length; i++) {
12
+ System.out.println("人口が最大の市町村は  県 : "+t[num-1].pref+": 市町村 :"+t[num-1].name+" : 人口 : "+t[num-1].population);
13
+ break;
14
+ ```
15
+ iが0から始まって、t.lengthは2000(それ以外でも0以上であることは確実)なので、for文の継続条件を最初から満たさず、for文の中に入ることができません。それ以前にfor文の存在が無意味です。
9
16
 
17
+ ###コード修正
18
+ #####Townクラス
19
+ まずTownはコンストラクタを用意して、必要なパラメータをまとめて設定しましょう。
20
+ また、Townのデータを出力する箇所がいくつかありますが、全部同じ形式です。こういうものこそTownのメソッドとして用意しましょう。ObjectクラスのtoString()メソッドをオーバーライドすれば、出力が簡単になります。
21
+ ```java
22
+ class Town {
23
+ String pref;
24
+ String name;
25
+ int population;
26
+
27
+ public Town(String p, String n, int pop) {
28
+ pref = p;
29
+ name = n;
30
+ population = pop;
31
+ }
32
+
33
+ @Override
34
+ public String toString() {
35
+ return "県 : " + pref + ": 市町村 :" + name + " : 人口 : " + population;
36
+ }
37
+ }
38
+
39
+ // 例えばMiddleの出力はこうできる
40
+ System.out.println(t[(num-1)/2]);
41
+ ```
42
+
43
+ #####要素数が決まっていないなら配列よりList
44
+ 要素数が決まっていないなら配列を使用するには向いていません。Listを使えばnumという変数は不要になります。課題などで配列限定なら仕方ないですが。
45
+ #####メソッドについて
46
+ メソッドはその役割だけを担うようにするべきです。sortはソートのみやるべきで、平均の出力をそのあとにやるということをこのメソッドが担当するべきではありません。
10
- コーが全体的ひどいので、帰ってから追記しま
47
+ また、メソッ名は小文字始まりにしましょう
48
+ ```java
49
+ public static void main(String args[]) {
50
+ Scanner kbd = new Scanner(System.in);
51
+ Town[] table = new Town[2000];
52
+ int count;
53
+
54
+ for(count = 0; kbd.hasNext() && count < 2000; count++) {
55
+ String p = kbd.next();
56
+ String n = kbd.next();
57
+ int num = kbd.nextInt();
58
+ table[count] = new Town(p, n, num);
59
+ }
60
+
61
+ sort(table, count);
62
+ middle(table, count);
63
+ average(table, count);
64
+
65
+
66
+ }
67
+ ```