質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

3570閲覧

平均と最大のメソッド、配列についてです。

frdhy

総合スコア11

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2017/10/07 11:39

市町村のデータをソートし、その平均と最大、最小を求めたいのですが、
平均と最大がうまくできません。
平均は"二項演算子'+'のオペランド型が不正です"と表示され、intからTownに直せないことはわかるのですが、全くどうしたらいいのかわかりません。
最大はもはやエラーも出ないし、実行した時に表示もされません。
どうしたら解決することができるでしょうか?
よろしくお願いします。

java

1import java.util.Scanner; 2class Town { 3 String pref; 4 String name; 5 int population; 6} 7 8public class Population { 9 public static void main(String args[]) { 10 Scanner kbd = new Scanner(System.in); 11 String p=null; 12 String n=null; 13 int num=0; 14 Town[] table = new Town[2000]; 15 Town temp; 16 int count=0; 17 18 for(int i=0; kbd.hasNext() && i<2000; i++) { 19 p = kbd.next(); 20 System.out.println(p); 21 n = kbd.next(); 22 System.out.println(n); 23 num = kbd.nextInt(); 24 System.out.println(num); 25 temp = new Town(); 26 temp.pref = p; 27 temp.name = n; 28 temp.population = num; 29 table[i] = temp; 30 count++; 31 } 32 33 sort(table,count); 34 35 } 36 37 38 public static void sort(Town[] t,int num) { 39 Town temp; 40 41 for(int i=0; i<num; i++) { 42 for(int j=i+1; j<num; j++) { 43 if(t[i].population<t[j].population) { 44 temp = t[i]; 45 t[i] = t[j]; 46 t[j] = temp; 47 } 48 } 49 } 50 51 Middle(t,num); 52 53 } 54 55 public static void Middle(Town[] t, int num) { 56 57 System.out.println("県 : "+t[(num-1)/2].pref+": 市町村 :" 58 +t[(num-1)/2].name+" : 人口 : "+t[(num-1)/2].population); 59 Average(t,num); 60 } 61 62 public static void Average(Town[] t, int num) { 63//このメソッドと 64 int total=0; 65 double ave=0; 66 for(int i=0; i<t.length; i++) { 67 total += t[i]; 68 } 69 ave = (double)total/(double)(num-1); 70 System.out.println("市町村人口の平均は"+ave); 71 72 Max(t,num); 73 74 } 75 76 public static void Max(Town[] t, int num) { //ここです。 77 for(int i=0; i>t.length; i++) { 78 System.out.println("人口が最大の市町村は  県 : "+t[num-1].pref+": 市町村 :"+t[num-1].name+" : 人口 : "+t[num-1].population); 79 break; 80 } 81 82 Min(t,num); 83 84 } 85 86 public static void Min(Town[] t, int num) { 87 for(int i=0; i<1; i++) 88 System.out.println("人口が最小の市町村は  県 : "+t[num-1].pref+": 市町村 :"+t[num-1].name+" : 人口 : "+t[num-1].population); 89 } 90 91} 92 93

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

java

1total += t[i];

ここでt[i]はTownインスタンスなので、このインスタンスの人口を取る必要があります。
他ではやっていますが、ここだけ抜けているようです。

java

1total += t[i].population;

最大に関しては

java

1for(int i=0; i>t.length; i++) { 2 System.out.println("人口が最大の市町村は  県 : "+t[num-1].pref+": 市町村 :"+t[num-1].name+" : 人口 : "+t[num-1].population); 3break;

iが0から始まって、t.lengthは2000(それ以外でも0以上であることは確実)なので、for文の継続条件を最初から満たさず、for文の中に入ることができません。それ以前にfor文の存在が無意味です。

###コード修正
#####Townクラス
まずTownはコンストラクタを用意して、必要なパラメータをまとめて設定しましょう。
また、Townのデータを出力する箇所がいくつかありますが、全部同じ形式です。こういうものこそTownのメソッドとして用意しましょう。ObjectクラスのtoString()メソッドをオーバーライドすれば、出力が簡単になります。

java

1class Town { 2 String pref; 3 String name; 4 int population; 5 6 public Town(String p, String n, int pop) { 7 pref = p; 8 name = n; 9 population = pop; 10 } 11 12 @Override 13 public String toString() { 14 return "県 : " + pref + ": 市町村 :" + name + " : 人口 : " + population; 15 } 16} 17 18// 例えばMiddleの出力はこうできる 19System.out.println(t[(num-1)/2]);

#####要素数が決まっていないなら配列よりList
要素数が決まっていないなら配列を使用するには向いていません。Listを使えばnumという変数は不要になります。課題などで配列限定なら仕方ないですが。
#####メソッドについて
メソッドはその役割だけを担うようにするべきです。sortはソートのみやるべきで、平均の出力をそのあとにやるということをこのメソッドが担当するべきではありません。
また、メソッド名は小文字始まりにしましょう。

java

1public static void main(String args[]) { 2 Scanner kbd = new Scanner(System.in); 3 Town[] table = new Town[2000]; 4 int count; 5 6 for(count = 0; kbd.hasNext() && count < 2000; count++) { 7 String p = kbd.next(); 8 String n = kbd.next(); 9 int num = kbd.nextInt(); 10 table[count] = new Town(p, n, num); 11 } 12 13 sort(table, count); 14 middle(table, count); 15 average(table, count); 16 17 18}

###参考コード(動作未検証)

java

1class Town { 2 String pref; 3 String name; 4 int population; 5 6 public Town(String p, String n, int pop) { 7 pref = p; 8 name = n; 9 population = pop; 10 } 11 12 @Override 13 public String toString() { 14 return "県 : " + pref + ": 市町村 :" + name + " : 人口 : " + population; 15 } 16} 17 18public class Population { 19 public static void main(String args[]) { 20 Scanner kbd = new Scanner(System.in); 21 List<Town> table = new ArrayList<>(); 22 23 while(kbd.hasNext()) { 24 String p = kbd.next(); 25 String n = kbd.next(); 26 int num = kbd.nextInt(); 27 table.add(new Town(p, n, num)); 28 } 29 30 Comparator<Town> comparator = Comparator.comparingInt(t -> t.population)) 31 32 Collections.sort(table, comparator); 33 System.out.println("中央: " + table.get((table.size() - 1) / 2)); 34 System.out.println("人口平均値: " + table.stream().mapToInt(t -> t.population).average().orElse(0.0)); 35 table.stream().max(comparator).ifPresent(t -> System.out.println("人口最大: " + t)); 36 table.stream().min(comparator).ifPresent(t -> System.out.println("人口最小: " + t)); 37 } 38 39 40}

投稿2017/10/07 13:49

編集2017/10/08 00:39
swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

frdhy

2017/10/08 10:57

とてもわかりやすかったです!! ありがとうございました!!!
guest

0

java

1import java.util.Scanner; 2 3class Town { 4 private final String pref; 5 private final String name; 6 private int population; 7 8 public Town(String pref, String name, int population) { 9 this.pref = pref; 10 this.name = name; 11 this.population = population; 12 } 13 14 public String getPref() { 15 return pref; 16 } 17 18 public String getName() { 19 return name; 20 } 21 22 public int getPopulation() { 23 return population; 24 } 25} 26 27public class Population { 28 static final int MAX_TABLE_NUM = 2000; 29 30 public static void main(String args[]) { 31 @SuppressWarnings("resource") 32 33 Scanner kbd = new Scanner(System.in); 34 Town[] table = new Town[MAX_TABLE_NUM]; 35 int count = 0; 36 37 for (int i = 0; kbd.hasNext() && i < MAX_TABLE_NUM; i++) { 38 String pref = kbd.next(); 39 System.out.println(pref); 40 String name = kbd.next(); 41 System.out.println(name); 42 int population = kbd.nextInt(); 43 System.out.println(population); 44 45 table[count] = new Town(pref, name, population); 46 count++; 47 System.out.println("" + count + "番目を追加しました。" + pref + ", " + name + ", " + population); 48 } 49 50 sort(table, count); 51 showResult(table, count); 52 } 53 54 public static void sort(Town[] t, int num) { 55 for (int i = 0; i < num; i++) { 56 for (int j = i + 1; j < num; j++) { 57 if (t[i].getPopulation() < t[j].getPopulation()) { 58 Town temp = t[i]; 59 t[i] = t[j]; 60 t[j] = temp; 61 } 62 } 63 } 64 } 65 66 public static void showResult(Town[] table, int num) { 67 if (num <= 0) { 68 System.out.println("データが空です。"); 69 return; 70 } 71 72 showMiddle(table, num); 73 showAverage(table, num); 74 showMin(table, num); 75 showMax(table, num); 76 } 77 78 public static void showMiddle(Town[] t, int num) { 79 System.out.println("人口の中央値は  県 : " + t[(num - 1) / 2].getPref() + ": 市町村 :" + t[(num - 1) / 2].getName() + " : 人口 : " 80 + t[(num - 1) / 2].getPopulation()); 81 } 82 83 public static void showAverage(Town[] t, int num) { 84 double total = 0; 85 for (int i = 0; i < num; i++) { 86 total += t[i].getPopulation(); 87 } 88 double ave = total / num; 89 System.out.println("市町村人口の平均は" + ave); 90 } 91 92 public static void showMax(Town[] t, int num) { 93 System.out.println("人口が最大の市町村は  県 : " + t[num - 1].getPref() + ": 市町村 :" + t[num - 1].getName() + " : 人口 : " 94 + t[num - 1].getPopulation()); 95 } 96 97 public static void showMin(Town[] t, int num) { 98 System.out.println( 99 "人口が最小の市町村は  県 : " + t[0].getPref() + ": 市町村 :" + t[0].getName() + " : 人口 : " + t[0].getPopulation()); 100 }

実行例:
イメージ説明

Town に コンストラクタ、getter を追加しました。
結果の表示は main から個別に呼び出すようにしました。

これは、いちおうは動作してますが、
main() で table[] を生成しているのをメソッドに切り出すようにする、 Town[] でなく List<Town> でデータを扱うようにする、town クラスに sort や、平均を求めメソッドを定義するようにする などの変更をしていくと良いと思います。

投稿2017/10/08 03:39

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

frdhy

2017/10/08 10:56

とても詳しくありがとうございます!! 出来ました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問