※ ChatGPTを利用し、要約された質問です(原文:多次元配列について質問)
Javaの多次元配列に関する質問 - 各列の合計を求める解答方法とは?
このQ&Aのポイント
Javaの多次元配列に関する質問です。与えられたソースコードでは、2次元配列pの各列(縦方向)の合計を求めています。
解答ソースコードでは、int型の配列sumを用意し、各列ごとに要素を足し合わせています。
具体的には、配列pの各要素をnとして取り出し、nの各要素をjとして取り出しています。sum[j]にn[j]を加算することで、各列の合計を計算しています。
以下は、Javaの参考書に掲載されていたある問題です。
その問題文と解答ソースコードを記載しますので、以下の疑問点に答えていただければ幸いです。
また、僭越ながらお願いがあるのですが、このソースコードを一度実行してから私の質問を見たほうが、より私の疑問点が回答者様にわかると思うので、実行してくだされば幸いです。
問題文:次のA~Cの手順に従ってプログラムを作成しなさい。
A:5×4の2次元配列のint型配列pを作成します。つまり、pは5個の要素を持ち、各要素が「4つの要素を持つintの配列」であるような配列です。
B:次にpの全要素にMath.random()で得られる乱数値を代入しなさい。乱数値は0から10の範囲になるように10倍し、さらにintにキャストして配列の要素に代入しなさい。
C:pの全ての要素を例示のように表示しなさい。(※ここでいう「例示」とは、私がこの質問板にupした画像のこと)ただし、pの各要素を5×4の表と見た時、各列の(縦方向の並び)の合計を、その5×4の表と見た時、各列(縦方向の並び)の合計も例示のように表示しなさい。
---解答ソースコード(クラス宣言は除きます)---
public static void main(String[]arg){
//A
int[][]p=new int[5][4];
//B
for(int i=0;i<p.length;i++){
for(int j=0;j<p[i].length;j++){
p[i][j]=(int)(Math.random()*10);
}
}
for(int[]n:p){
for(int m:n){
System.out.print(m+"\t");
}
System.out.println();//改行
}
//C
int[]sum=new int[p[0].length];
for(int[]n:p){
for(int j=0;j<n.length;j++){
sum[j]+=n[j];
}
}
System.out.println();
for(int m:sum){
System.out.print(m+"\t");
}
}
疑問点:Cの手順の解答について疑問なのですが、以下のソースコードで何故各列の合計を求められるかわかりません。何故ですか?凄く頭が引きちぎれるほど考えたのですがわかりませんでした。
int[]sum=new int[p[0].length];
for(int[]n:p){
for(int j=0;j<n.length;j++){
sum[j]+=n[j];
}
}
だって、例えば拡張for文でpの0番目の要素を取り出して、さらにfor文でその0番目の要素の0番目、1番目、2番目、3番目をsumに累計するといったように、縦方向でなく「横方向」に合計するソースコードに僕は思えるんですよ。何故縦方向に合計できるんですか?たしかに実行すると縦方向に合計されてるので、縦方向に合計するものには間違いなのだけれど、、
補足
お返事遅れてしまい大変申し訳ありませんでした。。。 R_Earlさんのご教示でたぶん解決しました! 今から、以下のソースコードが各列方向に累計がされる理由について、その見解を書きますね。正しいかどうか判定してください! int[]sum=new int[p[0].length]; for(int[]n:p){ for(int j=0;j<n.length;j++){ sum[j]+=n[j]; } } 例えば、外側の拡張for文が1回目のループに突入し且つ内側のfor文のループ制御変数jが0である場合、sum[0]にn[0](=p[0][0])が代入され、外側の拡張for文が2回目のループに突入し且つjが0である場合、sum[0]にn[0](=p[1][0])が再代入されるので、縦方向に累計されていくということでしょうか?