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

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

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

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

Q&A

解決済

3回答

2538閲覧

Java 二重ループの配列処理の仕様が分からない

Yuki2

総合スコア52

Java

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

0グッド

0クリップ

投稿2021/08/23 09:56

10が表示されるメカニズムを知りたい。

array[i].length;がどんな効果を持つのか、わからない。

java

1package chapter4.nine; 2 3public class Main { 4 public static void main(String[] args) { 5 int array[][] = new int[][] { { 1, 2 }, { 2, 3, 4 } }; 6 int total = 0; 7 for (int i = 0; i < array.length; i++) { 8 for (int j = i; j < array[i].length; j++) { 9 total += array[i][j]; 10 } 11 } 12 System.out.println(total); 13 } 14}

array[i]が何を定義しているのか分かりません。
j < i;だと0が表示されましたが何故でしょうか。

試したこと

Java 二重ループの動画を視聴した
JavaSE黒本第四章 問題9の二重ループの解説を参考にした。

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

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

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

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

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

guest

回答3

0

ベストアンサー

配列は理解していると仮定します。

int array[][]は、int配列の配列です。
なので、array[i] は、int配列です。

lengthは配列の要素数を取得しているのはご存じかと思います。

ここまででピンときたら以降は読む必要ありません。
もう少し冗長に説明します


int array[][] = new int[][] { { 1, 2 }, { 2, 3, 4 } };

を冗長に定義するなら

java

1int[] int0 = {1,2}; 2int[] int1 = {2,3,4}; 3int[][] array = {int0, int1};

と、なります。

宣言時の代入でなく、定義をしたあとに値を設定するなら

java

1int[] int0 = {1,2}; 2int[] int1 = {2,3,4}; 3 4int[][] array = new int[2][]; 5array[0] = int0; 6array[1] = int1;

array.lengthは、上記の通り2なので、iは0か1になります。
で、array[i]は、iが0なら{1,2} を参照します。
※ array[0] = int0

結果、ループの書き方とint配列の関係から
iが0の時は、jは、0、1
iが1の時は、jは、1、2(int1のlengthは、{2,3,4}なので3)

array[i][j]をループに合わせて加算すると
array[0][0]
array[0][1]
array[1][1]
array[1][2]
の合計が10になります。

なおデバッガ使って確認するのも良いですが、手っ取り早くiとjとarray[i][j]を表示しちゃうのが楽では?

java

1for (int i = 0; i < array.length; i++) { 2 for (int j = i; j < array[i].length; j++) { 3 total += array[i][j]; 4 System.out.printf("array[%d][%d]=%d%n", i, j, array[i][j]); 5 } 6}

投稿2021/08/23 10:54

momon-ga

総合スコア4826

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

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

Yuki2

2021/08/24 01:19

回答ありがとうございます。 理解する事が出来ました。
guest

0

まずは基礎からやりましょう。
今回は多次元は配列がわかっていれば簡単です。

int array[][] = new int[][] { { 1, 2 }, { 2, 3, 4 } };

は、イメージ的にはExcelの表のようなものですね。

A B C D E 1 [1][2][3][4][5] 2 [6][7][8][9][10] …

のような感じですね。

[1] にアクセスするには arr[1][A] でやる感じです。

arr[行][列]です。

この列がA,B,C…ではなく、0,1,2,… となり、
行は0から開始するような感じでしょうか。

そして、

int[] arr2 = arr[0];

っていうのは、Excelっぽく言うと『1行目のデータ列』です。
値は上で言うと1〜5ですね。

つまり、『0番目のデータ列』、配列が取得できる。

だから、arr[i].lengthは
『i番目のデータ列の長さ』です。

投稿2021/08/24 00:57

編集2021/08/24 01:27
BeatStar

総合スコア4962

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

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

0

array[i]が何を定義しているのか分かりません。

定義ではなく、参照です。
定義されてるのはコード見る限りでは下記

java

1int array[][] = new int[][] { { 1, 2 }, { 2, 3, 4 } };

j < i;だと0が表示されましたが何故でしょうか。

初期値がiの値なので1周もまわりません。

デバッグして1つ1つの値がいつ何を保持しているか確認しましょう。
※eclipseなどデバッグモードが標準でついているIDE推奨

投稿2021/08/23 09:59

m.ts10806

総合スコア80875

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

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

Yuki2

2021/08/23 10:14

ではarray[i]の参照は何なのでしょうか?
m.ts10806

2021/08/23 10:48 編集

質問の意味が分かりません。 「定義」と「参照」の違いが分かっていない感じですか? また、デバッグされましたか?
m.ts10806

2021/08/23 10:54

ただ、JavaSE黒本となるとSilverですよね。 基礎ができた前提でないと本の解説も質問して得た回答も理解できないと思います。Silver目指すくらいの人なら理解できるかなと思った回答が伝わってないので、やはり入門書からされたほうが良いです。
Yuki2

2021/08/23 12:00

スッキリわかるJava入門を完了して黒本に取り組んでいる最中です。
m.ts10806

2021/08/23 12:43

完了されたのでしたら、分からないというのが分かりません。 内容は入門書にあるレベルです。
BeatStar

2021/08/24 00:33

もしかすると、質問者さんは『参照型』とかのような、別の意味で取っている可能性もありますね。
Yuki2

2021/08/24 01:17

m.ts10806さん ご忠告ありがとうございます。
m.ts10806

2021/08/24 01:36

1、2本簡易なCLI実行アプリは作ったほうが良いです。CSVとDBを扱うようなものならそれなりに機能を使うことになるので理解度確認と考察力の向上には良いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問