🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Java

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

配列

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

Q&A

解決済

2回答

3805閲覧

f多次元配列の1行ごとの合計の出し方・成績表を作りたい

Gingerale09

総合スコア8

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Java

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

配列

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

0グッド

0クリップ

投稿2021/03/08 05:19

編集2021/03/10 08:33

前提・実現したいこと

2次元配列を使った成績表を作っています。
完成イメージはこのように名前と平均成績の表を出したいです。
完成イメージ

発生している問題・エラーメッセージ

エラーコードは出ていないのですが、何も表示さないです。

該当のソースコード

java

1package jp.learningdesign.javastudy; 2 3 class Task2_Lab5 { 4 5 public static void main(String[] args) { 6 //1. input 7 String[][] names = { 8 {"Ewell ", "Nate"}, 9 {"Smurthwaite ", "Adelina"}, 10 {"Bernollet ", "Maryjane"}, 11 {"Chalfain ", "Karlis"}, 12 {"Huckabe ", "Almire"} 13 }; 14 double[][] grades = { 15 {3.83, 9.21, 9.25, 0.84, 1.40, 7.90, 1.41, 5.15}, 16 {5.09, 3.66, 3.04, 3.02, 8.59, 2.34, 8.86, 7.40}, 17 {5.35, 0.85, 8.56, 7.37, 2.78, 3.19, 2.04, 5.70}, 18 {9.25, 9.62, 7.08, 7.27, 9.86, 5.88, 9.86, 9.70}, 19 {3.39, 2.75, 1.23, 1.04, 3.87, 8.72, 4.60, 6.21} 20 }; 21 22 } 23 public double classAverage(double[][] grades, double classAverage) { 24 25 // avg of per line 26 double[] personAvg = new double[grades.length]; 27 for (int i = 0; i < grades.length; i++) { 28 double Sum = 0; 29 for (int j = 0; j < grades[i].length; j++) { 30 31 double classSum = 0; 32 double classAvg = 0; 33 } 34 35 double classAvg = ((Sum / grades.length) / grades[0].length); 36 37 personAvg[i] = Sum / grades[i].length;// 1行の平均 38 System.out.println("each students average " + personAvg[i]); 39 System.out.println("class average " + classAvg); 40 41 } 42 return classAverage; 43 } 44 45 public void printNames(String[][] names, double[] personAvg) { 46 String students = " "; 47 for (int i = 0; i < names.length; i++) { 48 for (int j = names[i].length - 1; j >= 0; j--) { 49 students += " " + names[i][j]; 50 } 51 students += "\t" + personAvg[i]; 52 } 53 System.out.print(students + "\t\n"); 54 students = ""; 55 56 57 } 58 }

試したこと

classAverage(grades);
printNames(names) ;

classAverage();
printNames() ;
をメインにおきましたがエラーが出ます。

The method classAverage(double[][], double) in the type Task2_Lab5 is not applicable for the arguments (double[] [])

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

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

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

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

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

yambejp

2021/03/08 05:28

javaかなにか?使用プログラム言語のタグ付けしてください
Gingerale09

2021/03/08 05:48

失礼しました。Javaです。
guest

回答2

0

ベストアンサー

Java8以降を使っている前提ですが、この手の配列の処理は
streamを使用すると簡単に算出する事ができます。

Java

1import java.util.ArrayList; 2import java.util.Arrays; 3import java.util.List; 4 5public class Test { 6 7 public static void main(String[] args) { 8 String[][] names = { 9 {"Ewell ", "Nate"}, 10 {"Smurthwaite ", "Adelina"}, 11 {"Bernollet ", "Maryjane"}, 12 {"Chalfain ", "Karlis"}, 13 {"Huckabe ", "Almire"} 14 15 }; 16 17 double[][] grades = { 18 {3.83, 9.21, 9.25, 0.84, 1.40, 7.90, 1.41, 5.15}, 19 {5.09, 3.66, 3.04, 3.02, 8.59, 2.34, 8.86, 7.40}, 20 {5.35, 0.85, 8.56, 7.37, 2.78, 3.19, 2.04, 5.70}, 21 {9.25, 9.62, 7.08, 7.27, 9.86, 5.88, 9.86, 9.70}, 22 {3.39, 2.75, 1.23, 1.04, 3.87, 8.72, 4.60, 6.21} 23 }; 24 25 var obj = new Test(); 26 List<Double> averageList = new ArrayList<>(); 27 for (int i = 0; i < grades.length; i++) { 28 double[] grade = grades[i]; 29 double average = obj.average(grade); 30 // 1行毎の平均値を保存 31 averageList.add(average); 32 System.out.println(obj.round(average)); 33 } 34 // 1行毎の平均からクラス全体の平均を算出 35 var average = obj.average(averageList); 36 System.out.println(obj.round(average)); 37 38 // 2次元配列から一括でクラス平均を算出 39 var classAverage = obj.classAverage(grades); 40 System.out.println(obj.round(classAverage)); 41 } 42 43 /** 44 * 平均値を算出する. 45 * 46 * @param grade 成績 47 * @return 平均値 48 */ 49 public double average(double[] grade) { 50 return Arrays.stream(grade).average().getAsDouble(); 51 } 52 53 /** 54 * 平均値を算出する. 55 * 56 * @param grade 成績 57 * @return 平均値 58 */ 59 public double average(List<Double> grade) { 60 return grade.stream() 61 .mapToDouble(Double::doubleValue) 62 .average() 63 .getAsDouble(); 64 } 65 66 /** 67 * 2次元配列の配列要素毎の平均値を算出する. 68 * 69 * @param grades 成績 70 * @return 平均値 71 */ 72 public double classAverage(double[][] grades) { 73 return Arrays.stream(grades) 74 .map(grade -> this.average(grade))// 配列要素毎に平均値を計算[4.87 , 5.25 , 4.48 , 8.57, 3.98] 75 .mapToDouble(Double::doubleValue) // 型変換 76 .average() // 平均値の平均を計算 77 .getAsDouble(); 78 } 79 80 /** 81 * 小数点第3位を四捨五入した文字列を返す. 82 * 83 * @param value double値 84 * @return 文字列 85 */ 86 public String round(double value) { 87 return String.format("%.2f", value); 88 } 89} 90 91

投稿2021/03/09 00:51

Luice

総合スコア771

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

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

Gingerale09

2021/03/09 07:16

すみません。streamについて調べたところstreamを使うときれいにコードが表示できるようなのですが、私、勉強を初めたばかりでして、streamの使い方が全く分からないです。
guest

0

> 1行ごとの合計の出し方につまずいている

1行ごとの合計を保存する変数を用意します。
gpaや、classSumと同様に、その変数に対して合算します。
必要に応じて、平均を出すためにlengthで割ります。

途中ぬかして上記だけ書くと、こんな感じ。

java

1for (int i = 0; i < grades.length; i++) { 2 double personSum = 0.0; // 1行の合計保存用 3 for (int j = 0; j < grades[i].length; j++) { 4 personSum += grades[i][j]; // 合計する 5 } 6 // ループを抜けた(1行の合計が終わった)あとに平均を求める 7 double personAvg = personSum / grades[i].length; // 1行の平均 8}

投稿2021/03/08 07:21

momon-ga

総合スコア4826

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

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

momon-ga

2021/03/08 07:33

そいや、クラス平均のだしかた間違ってない? つど割ってると、めっちゃ小さな値になりそうだけど・・・
Gingerale09

2021/03/08 11:49

ありがとうございます。 double personSum = 0.0;は j=0のfor の前に置くから機能するのですか? 結果は5.3400000000003 みたいになっています。。。
momon-ga

2021/03/08 15:00 編集

機能するとは? 変数を参照する前に定義すればよいですし、(j=0のforの前) 1行分ごとに0に初期化しないと総合計(classSum?)と同じになります。 ※定義する位置をいろいろ変えてみれば、挙動が理解できるかと思います > 結果は5.3400000000003 みたいになっています。。。 2進数で小数部を扱うと、そんな感じになります。
Gingerale09

2021/03/09 07:07

私はfor ループの前にdouble sum=0; を置いていたため、2行目からが前行の値がどんどん足されていく状態になっていました。理解できました。ありがとうございます。
momon-ga

2021/03/09 07:13

なるほど。ありがちですね。 i=0のforループの前に書いた場合は、j=0のforループの前で double sum=0;、でなく sum=0; とすれば、同様の結果になります。(コンパイルエラーにならない) 不必要に変数スコープを大きくしないように、ループの中で定義するのが良い場合が多いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問