2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Java Silver】2次元配列 length 解説

Posted at

Java silver se11の試験対策で黒本を解いていた際のlenthの動きをまとめました。

初心者向け

2次元配列 length

◼︎ 黒本 第12章 総仕上げ問題①

80.次のプログラムをコンパイル、実行したときの
   結果として、正しいものを選びなさい。
  (1つ選択)
問題80
public class Test {
  public static void main(String[] args) {
     String[][] arrays = new String[2][];
     array[0] = new String[2];
     array[1] = new String[5];
     int i = 97;
     for (int a = 0; a < array.length; a++) {
       for(int b = 0; b < array.length; b++) {
         array[a][b] = "" + i ;
         i++;
       }
     }
     for (String[] tmp : array) {
       for(String s : tmp) {
         System.out.print(s + "");
        }
       System.out.println();
     }
   }
}
A. 97 98
   99 100 null null null
B. 97 98
   99 100 101 102 103
C. コンパイルエラーが発生する
D. 実行時にNulIPointerExceptionがスローされる
E. 実行時にArrayindexOutofBoundsExceptionが
   スローされる

答え: A

1行ずつ解説

問題80 解説
public class Test {
//Testという名前のパブリッククラスを定義
  public static void main(String[] args) {
  /* プログラムのエントリポイントであるmainメソッドを定義
   プログラムはここから開始 */
     String[][] arrays = new String[2][];
     /* arrayという名前の2次元配列を宣言
        2列の配列を持つが、まだ各行の配列は
        決まっていない
     */
     array[0] = new String[2];
     //arrayの0行目に2列の配列を割り当て
     array[1] = new String[5];
     //arrayの1行目に5列の配列を割り当て
     int i = 97; //整数変数iを97(文字コードa)で初期化
     for (int a = 0; a < array.length; a++) {
     //外側のforループ 各行の列数だけ繰り返す
       for(int b = 0; b < array.length; b++) {
       //内側のforループ 条件がarray.lengthになっている
       /* 各行の配列array[a].lengthを使う必要がある
         2列名以降が初期化されずnullのままになる */
          array[a][b] = "" + i ;
          //array[a][b]に文字列としてiの値を代入
          i++;
          //iをインクリメントして次の文字コードにする
       }
     }
      for (String[] tmp : array) {
      //拡張forループを使ってarrayの各行をtmpに取り出す
        for(String s : tmp) {
        //拡張forループを使って各行の各要素をsに取り出す
           System.out.print(s + "");
           //各要素String sを出力
        }
        System.out.println();
        //各行を出力した後に改行する
      }
   }
}

nullが出力される理由

arrayの0行目は2列、1行目は5列だが、内側のforループがarray.lengthを条件にしているため、各行の列数を正しく処理出来ていない
そのため以下のように配列の一部のみが初期化され、他はnullのままとなる
•array[0][0]とarray[0][1]には値が入るが、それ以外の列は初期化されない
•array[1][0]とarray[1][1]にも値が入るが、それ以外の列array[1][2]、array[1][3]、array[1][4]は初期化されずnullのまま
そのため出力結果は以下のようになる

97 98
99 100 null null null

拡張for文と通常のfor文の違い

通常のfor文

ループの初期化・条件・更新部分を自分で指定する

例文
for (int i = 0; i < array.length; i++) {
     System.out.println(array[i]);
}

・int i = 0;で初期化
・i < array.length;が条件
・i++で更新

拡張for文

コレクションや配列の全ての要素に対して
繰り返し処理を行うために使う

例文
for (String element : array) {
     System.out.println(element);
}

arrayの各要素をelementとして順に取り出す

それぞれの違い

•拡張for文はシンプルで読みやすいが、インデックス(位置)にアクセス出来ない
•通常のfor文は柔軟でインデックスの操作が可能

文字コードと文字

コンピュータでは、文字を数値(文字コード)で表す。たとえば、‘A’の文字コードは65

char ch = 65; // 文字コード65に対応する文字 'A'
System.out.println(ch); // 'A'が出力される

文字から文字コードへの変換
文字を数値に変換する場合、キャスト(型変換)を使う

char ch = 'A';
int code = (int) ch; // 'A'を整数に変換
System.out.println(code); // 65が出力される

配列の読み方

1次元配列

1次元配列は単純なリストのイメージ

int[] array = {1, 2, 3, 4};
System.out.println(array[0]); // 1
System.out.println(array[1]); // 2

•array[0]は最初の要素。
•array[1]は2番目の要素。

2次元配列

2次元配列は行と列を持つ表のようなイメージ

int[][] array = {
    {1, 2, 3},
    {4, 5, 6}
};
System.out.println(array[0][0]); // 1
System.out.println(array[1][2]); // 6

•array[0][0]は1行目の1列目の要素。
•array[1][2]は2行目の3列目の要素。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?