第6回 配列(その2)

1 配列のつづき
  
・以下の水色の節は、教科書(やさしいJava)の内容に沿って説明しています
 - 教科書の大事なところを抜粋して、掲載している
 - 「Lesson 7 の内容(p.176から)
  ページ数は、第6版と第7版で少しずれているかも、でも内容は同じ
 - 教科書も目を通しておくこと
  
  
 7.5 配列変数(教科書 p.192)
 
・配列変数に代入する
 
 - 通常の配列の宣言 
  int [] test1; //
int型の配列変数
  test1 = new int[5]; // 5個の要素を確保
 
・配列変数に代入するということ
 
 - 配列変数への代入
  int [] test1; // int型の配列変数
  test1 = new int[5]; // 5個の要素を確保
  int [] test2; // int型の配列変数のみ宣言
  test2 = test1; // 配列変数どうしの代入

  test2test1 は、同じ要素にアクセスするようになる


 - test1 = new int[5]; は、要素を5つメモリ上に確保して、そこにアクセスする
  (参照する)ためのポイントを test1 に設定した、という処理を行っている
 
 - test2 = test1; は、参照先を代入しただけで、5個の要素を代入(コピー)したわけではない
     
    
 7.6 配列の応用
 
・配列の長さを知る

 - 配列の長さ(利用可能な要素数)は .length を使う
 - for文 と組み合わせて利用する場合が多い
 
<基本的な使い方>
  int [] test = {80,60,22,50,75}; // 要素数は5
   :
  for(int i=0;i<test.length;i++){ // i=0,1,2,3,4と5回繰り返す
    
println(test[i]);
  }

           
<異なる要素数に柔軟に対応できる>
  int [] test = {80,60,22,50,75,92,15,55}; // 要素数は8
   :
  for(int i=0;i<test.length;i++){ // i=0,1,2,・・,7と8回繰り返す
    
println(test[i]);
  }
 
           

・配列の内容をソートする

 - 配列に格納されている値を 大きい順小さい順 に並び替える(ソートする)

   降順 :大きい --> 小さい (80,75,60,50,22)
   昇順 :小さい --> 大きい (22,50,60,75,80)

 - ソートの手法は多くの種類がある、教科書の方法は「選択ソート」
  小さいものを探し、先頭から順番に埋めていく

 80,60,22,50,75  <このデータを昇順に並び替える手順>
 80,60,22,50,75  5個の要素の中で、最小値を探す (22が最小値)
 22,60,80,50,75  最小値(22)と配列[0](80)を入れ替える
 22,60,80,50,75  配列[0]は決定、残り4個の要素の中で、最初値を探す(50が最小値)
 22,50,80,60,75  最小値(50)と配列[1](60)を入れ替える
 22,50,80,60,75  配列[1]は決定、残り3個の要素の中で、最初値を探す(60が最小値)
 22,50,60,80,75  最小値(60)と配列[2](80)を入れ替える
 22,50,60,80,75  配列[2]は決定、残り2個の要素の中で、最初値を探す(75が最小値)
 22,50,60,75,80  最小値(75)と配列[3](80)を入れ替える
 22,50,60,75,80  比較する要素がないので、ここで処理は終了
 22,50,60,75,80  並び替え完了!
 
<選択ソートのデモ(降順)> 
   
  
   
 7.7 多次元配列
 
・多次元配列のしくみを知る
・多次元配列の書きかた

 - 1次元配列
  int [] x = {80,60,22,50,75};
 
x[0] x[1] x[2] x[3] x[4]
80 60 22 50 75
 
 - 2次元配列
  int [][] y; // 2次元配列の配列変数
  y = new int [3][4]; // 3行4列の要素(領域)を確保
 または
  int [][] y = {{52,83,34,72},{21,48,32,89},{10,24,59,93}};
 
y[0][0] y[0][1] y[0][2] y[0][3]
52 83 34 72
   
y[1][0] y[1][1] y[1][2] y[1][3]
21 48 32 89
     
y[2][0] y[2][1] y[2][2] y[2][3]
10 24 59 37
  
for文の2重ループを用いる>
void setup()
{
  int [][] y = {{52,83,34,72},{21,48,32,89},{10,24,59,93}};

  // 3行4列の2次元配列を表示する
  for(int i=0;i<3;i++){ // i=0,1,2
    for(int j=0;j<4;j++){ // j=0,1,2,3
      print(" " + y[i][j]);
    }
    println(""); // 改行のみ
  }
}

   
 実行すると以下のようになる
 
 
  
 - 要素数の異なる組み合わせも可能
  int [][] y = {{52,83},{21,48,32,89},{10,24,59}};
 
y[0][0] y[0][1]
52 83
   
y[1][0] y[1][1] y[1][2] y[1][3]
21 48 32 89
     
y[2][0] y[2][1] y[2][2]
10 24 59
  
for文の2重ループを用いた例>
void setup()
{
  int [][] z = {{52,83},{21,48,32,89},{10,24,59}};

  // 2次元配列を表示する
  for(int i=0;i<3;i++){ // i=0,1,2
    for(int j=0;j<z[i].length;j++){ // jは .length-1 まで
      print(" " + z[i][j]);
    }
    println(""); // 改行のみ
  }
}

   
  実行すると以下のようになる
 
  
        
 
    
2 配列変数を引数にする
   
・ 関数(メソッド)の呼び出しで、配列変数を引数に渡す
 - 関数の引数に配列変数を使うことができる
 - 関数内で配列変数の値を更新すると、呼び出し元の値も更新される
 - C言語のポインタ渡しに相当
 
・ 配列の内容を表示する関数の例

void setup()
{
  int [] x = {80,60,22,50,75};

  showArray(x); // 引数に配列変数を指定
}

// 配列の内容を表示する関数
void showArray( int [] a )
{
  for(int i=0;i<a.length;i++){
    print(" " + a[i] );
  }
  println("");
}

  
 <実行例>  
 
  

・ 関数で配列のすべての要素に1を加算する例
void setup()
{
  int [] x = {8,3,7,5};
  int i;

  print("Before ");
  for(i=0;i<x.length;i++) print(" " + x[i]);

  addArray(x); // 関数呼び出し

  println(""); // 改行
  print("After  ");
  for(i=0;i<x.length;i++) print(" " + x[i]);
}

// 配列のすべての内容に1を加算する関数
void addArray( int [] a )
{
  for(int i=0;i<a.length;i++){
    a[i] = a[i] + 1;
  }
}
  
 <実行例>  
 
    
  
・引数は複数個でも渡すことができる
  
 - 配列に指定した値で埋める関数の例
void setup()
{
  int [] x = new int[5];
  int i;

  print("Before ");
  for(i=0;i<x.length;i++) print(" " + x[i]);

  setArray(x,3); // 関数呼び出し

  println(""); // 改行
  print("After  ");
  for(i=0;i<x.length;i++) print(" " + x[i]);
}

// 配列のすべての内容にnを代入する関数
void setArray( int [] a, int n )
{
  for(int i=0;i<a.length;i++){
    a[i] = n;
  }
}
  
 
    
   
  
 演習
  
  演習のページへ