配列2

<本章の目的>配列を更に深く理解する。ちょっとややこしい……。

問題9-2-1 多次元配列を用いたプログラムを作って下さい。

○答え

public class Heikin6{
  public static void main(String[] args){
    int[][] tens={
      {63,90,75,45,81},
      {85,100,95,80,90},
      {100,100,100,100,100},
    };
    for(int i=0;i<tens.length;i++){
      int sum=0;
      for(int j=0;j<tens[i].length;j++){
        System.out.print("\t"+tens[i][j]);
          sum+=tens[i][j];
      }
      System.out.println("\t| "+(double)sum/tens[i].length);
    }
  }
}


○実行結果

D:\atsushi\Java\List9-6>java Heikin6
 63 90 75 45 81 | 70.8
 85 100 95 80 90 | 90.0
 100 100 100 100 100 | 100.0
-- Press any key to exit (Input "c" to continue) --

○解説

二次元配列はの宣言は int[][] tens=new int[3][5]; と書きます。
宣言と同時に初期化も行う場合は
int[][] tens={
  {63,90,75,45,81},
  {85,100,95,80,90},
  {100,100,100,100,100},
};
と書きます。
一次元配列と同じで、
new 演算子を使って明示的にメモリ領域を確保する必要はありません。

二次元配列は、配列の配列です。
したがって、tens.length フィールドの値は 3、
tens[0].length フィールドの値は 5 です。

問題9-2-2 要素数が一定ではない多次元配列を用いたプログラムを作って下さい。

○答え

public class Heikin6a{
  public static void main(String[] args){
    int[][] tens={
      {3,14,159,26,},
      {53,5,},
      {897,93,238,},
    };
    for(int i=0;i<tens.length;i++){
      int sum=0;
      for(int j=0;j<tens[i].length;j++){
        System.out.print("\t"+tens[i][j]);
        sum+=tens[i][j];
      }
      System.out.println("\t| "+(double)sum/tens[i].length);
    }
  }
}


○実行結果

D:\atsushi\Java\p221>java Heikin6a
 3 14 159 26 | 50.5
 53 5 | 29.0
 897 93 238 | 409.3333333333333
-- Press any key to exit (Input "c" to continue) --

○解説

多次元配列の要素数は一定でなくても問題ありません。

配列要素を区切るコンマ , は最後の要素の後には
付けても付けなくてもどちらでも構いません。
多次元配列の場合、体裁を整える為にコンマ , を付けるのが一般的です。

問題9-2-3 次のうち、配列の宣言として正しいものはどれですか?

(1) int a[3];
(2) int[] a=int[3];
(3) int[] a=new int[3];
(4) int[3] a={10,20,30};
(5) int[] a={10,20,30,};
(6) int a[]=new int[3];
(7) int a[]={10,20,30,};


○答え&解説

 × (1) int a[3];

配列の長さは、ここには書けません。

 × (2) int[] a=int[3];

new が抜けています。

 ○ (3) int[] a=new int[3];

問題ありません。

 × (4) int[3] a={10,20,30};

配列の長さは、ここには書けません。

 ○ (5) int[] a={10,20,30,};

最後の配列要素 30 の後のコンマ , はあってもなくても構いません。

 ○ (6) int a[]=new int[3];

変数名の後に [] を書く、C言語、C++言語で見慣れた書き方も出来ます。
なんてC++言語プログラマに優しいんでしょうね(笑)。
これは (3) int[] a=new int[3]; と全く同じです。

 ○ (7) int a[]={10,20,30,};

(5) int[] a={10,20,30,}; と全く同じです。

○補足

多次元配列の宣言も int array[][]; のように書くことが出来ます。
これは int[][] array; と全く同じです。

○補足2

配列と普通の変数の宣言を一行に並べて書きたい場合は注意が必要です。
 ○ int array[],num;
 × int[] array,num;
この場合、Java言語特有の書き方は出来ず、C++言語の書き方に倣うしかありません。
int[] array,num; では、num まで配列だと見なされてしまいます。

問題9-2-4 配列を戻り値とするメソッドを用いたプログラムを作って下さい。

○答え

public class MethodTest1{
  public static String[] getYourName(){
    String[] myoji_namae={"福沢","諭吉"};
    return myoji_namae;
  }
  public static void main(String[] args){
    String[] s=getYourName();
    System.out.println("名字は"+s[0]);
    System.out.println("名前は"+s[1]);
  }
}


○実行結果

D:\atsushi\Java\ListA8-2>java MethodTest1
名字は福沢
名前は諭吉
-- Press any key to exit (Input "c" to continue) --

○解説

getYourName メソッドの戻り値は String 型配列です。

驚くべきは String[] s=getYourName(); で、配列に配列を代入している、ということでしょう。
しかし、配列は参照型である、ということを思い出せば、
ポインタを代入しているだけなのかな?だから良いのかな?という気がしなくもありません。
もっとこのことを分かり易いプログラムで示せば、次のようになります。

int[][] tens={
  {63,90,75,45,81},
  {85,100,95,80,90},
  {100,100,100,100,100},
};
int[][] array=tens;

このプログラムも何ら問題ありません。

問題9-2-5 二つの文字列を返すメソッドを用いたプログラムを作って下さい。

○答え

public class MethodTest3{
  public static void getYourName(String[] args){
    args[0]="福沢";
    args[1]="諭吉";
  }
  public static void main(String[] args){
    String[] s=new String[2];
    getYourName(s);
    System.out.println("名字は"+s[0]);
    System.out.println("名前は"+s[1]);
  }
}


○誤答

public class MethodTest{
  public static void getYourName(String myoji,String namae){
    myoji="福沢";
    namae="諭吉";
  }
  public static void main(String[] args){
    String x,y;
    getYourName(x,y);
    System.out.println("名字は"+x);
    System.out.println("名前は"+y);
  }
}


○実行結果

D:\atsushi\Java\ListA8-4>java MethodTest3
名字は福沢
名前は諭吉
-- Press any key to exit (Input "c" to continue) --

○解説

String 型配列 String[] s; の s はポインタですね。
つまり、答えはポインタをメソッドに渡していることになります。
ならば String 型も配列と同じ参照型、String x,y; の x と y もポインタであるはず。
つまり、誤答としたプログラムでも動くような気がするのですが……
コンパイラは以下のように仰っております。

■D:\atsushi\Java\List8-6> javac MethodTest.java
MethodTest.java:8: 変数 x は初期化されていない可能性があります。
getYourName(x,y);
         ^
MethodTest.java:8: 変数 y は初期化されていない可能性があります。
getYourName(x,y);
          ^
エラー 2 個

String 型に初期化は必要なかったはずだが?
うーむ、よく分からん……。
また、 getYourName(String[] args,String[] str) とした場合、
つまり、引数が二つある場合も正常に動作したことをお知らせしておきます。
とりあえず、クラスは駄目で配列は大丈夫!とでも覚えておきますかね(汗)。

○補足

main メソッドにも言えることですが、
引数 args という名前は自由に変更することが出来ます。


戻る / ホーム