7.配列

  配列(array)は同じ型の値(要素という)を複数まとめて記憶する機能をもつ。 個々の要素(element)は添字(インデックス:index)で指定する。 配列変数は参照型の変数で、配列の実体(オブジェクト)はnewで生成するか初期化によって生成しなければならない。 参照型の変数はCのポインタに相当する。

  1. 配列の準備
    1. 配列変数(array variable)の宣言(declaration)
      型名[] 配列変数名;
      型名 配列変数名[]; // も可!
    2. 配列の生成(要素の確保)
      配列変数名 = new 型名[要素数];
      

    • Javaの配列の要素数(長さ)は、newによって生成されたときに決まるので、定数でなくてもよい
      (⇔ Cの配列は静的なので、定義の際の要素数はコンパイル時に決定している定数でなければならない)
    • 1文にまとめることも可能
      型名[] 配列変数名 = new 型名[要素数];
      型名 配列変数名[] = new 型名[要素数]; // も可!
    • 生成した配列要素の初期値は 0(boolean型の場合はfalse

  2. 配列の初期化
    型名[] 配列変数名 = { 値1, 値2, ... };
    型名 配列変数名[] = { 値1, 値2, ... }; // も可!
    • 配列の宣言、生成、値の代入が同時になされる
  3. 配列の要素数(長さ)と要素の指定
    配列変数名.length
    
    • 生成された配列オブジェクトの長さは変更できない!
      (⇔ 可変長の配列が必要な場合はArrayListクラス等を用いる!!
    配列変数名[添字];
    
    • 添字(インデックス:index)の範囲は 0 から 要素数-1
    • 添字は範囲内かどうかチェックされる
    • 添字が範囲外のとき、ArrayIndexOutOfBoundsExceptionがスローされる
  4. 配列のコピー
    • 配列要素を順に全て表示する
      for( int i = 0; i < t.length; i++ )
      	System.out.println( t[i] );
      
    1. 配列変数を代入すると...同じ配列を指すようになる
      // 配列変数を代入
      d = s;
      
    2. 要素をコピーすると...元の配列の値が更新される
      // 同じサイズの配列sからdへ各要素をコピー
      for( int i = 0; i < s.length; i++ )
      	d[i] = s[i];
      
    3. cloneメソッドを使うと...別の配列が用意される
      // cloneメソッドを使ったコピー
      d = s.clone();
      
    • 配列変数の比較、d == s は、a. のように
      同じ配列を指しているときにだけ真(true)になる。
    • この一連を理解する為のプログラム:Array1.java


  5. 整列(ソーティング:sorting)
     ある基準(キーという)でデータの数値の大小順や文字列の辞書順(五十音順)に並べ替えることをソーティング(sorting)と言い、
    • バブルソート(bubble sort)
    • 選択ソート(selection sort)
    • 挿入ソート(insertion sort)
    • シェルソート(shell sort)
    • クイックソート(quick sort)
    • マージソート(merge sort)
    • ヒープソート(heap sort)
    等のアルゴリズムがある。
  6. 多次元配列
    • 配列の準備(2次元の場合)
      型名[][] 配列変数名;
      型名 配列変数名[][]; // も可!
      配列変数名 = new 型名[要素数][要素数];
      
      型名[][] 配列変数名 = new 型名[要素数][要素数];
      型名 配列変数名[][] = new 型名[要素数][要素数]; // も可!
    • 要素の指定
      配列変数名[添字][添字];
      
      • 添え字は 0 から 要素数-1
    • 配列の初期化
      型名[][] 配列変数名 = { { 値11, 値12, ... }, 
      	{ 値21, 値22, ... }, { 値31, ... }, ... };
      型名 配列変数名[][] = { { 値11, 値12, ... }, 
      	{ 値21, 値22, ... }, { 値31, ... }, ... }; // も可!
      
      • いびつな(長さが揃っていない)配列も作成可能
        int[][] aa = {
        		{ 1, 2, 3 },
        		{ 2, 3 },
        		{ 3, 4, 5, 6 }
        	};
        
    • 配列の長さ
      • 高次側
        配列変数名.length
        
      • 低次側
        配列変数名[添字].length
        














  7. コマンドライン引数を使う

    > java ○○○ 123 abcd ... Hello

    public static void main(String[] args)
    {
    
    }
    
    • コマンドラインの引数が、 args[0]args[1]
      ... args[args.length-1] に入ってくる
  8. 一般のオブジェクトの配列はこちら
  9. 練習問題
    1. 「コマンドライン引数の表示プログラム」
      入力されたコマンドラインの引数を1行ずつに表示するプログラム(ListCom1.java)
      例:
      > java ListCom1 123 abc 4567
      123
      abc
      4567
    2. 「パターンの表示プログラム」
      コマンドラインで指定されたサイズ(横×縦)で、次のパターンを表示するプログラム(Pat1.java)
      (サイズ指定が無い場合は16×12のサイズで表示せよ)
      例:
      > java Pat1 12 8
      □☆□□□☆□□□☆□□
      □☆□□□☆□□□☆□□
      ☆★☆☆☆★☆☆☆★☆☆
      □☆□□□☆□□□☆□□
      □☆□□□☆□□□☆□□
      ☆★☆☆☆★☆☆☆★☆☆
      □☆□□□☆□□□☆□□
      □☆□□□☆□□□☆□□
    3. 「データ入力表示プログラム」
      負数が入力されるまで入力された整数を、入力された順に配列に格納し、配列のデータを表示する(Input1.java)
      (入力されるデータ数は最大で100個であるとする。また、一行に10個ずつ表示せよ)
      (一行当たりの表示個数が10以下になっても大丈夫なようにしておくこと!)
      例:
      データを入力して下さい。(負数で終了します。)
      2
      43
      555
      1
      38
      -1
      入力された配列データ:
      2      43     555    1      38
    4. 「データ並べ替えプログラム」
      負数が入力されるまで入力された整数を、入力された順に配列に格納し、配列のデータを表示し、
      配列内のデータを昇順(小さい順)に並べ替えて、配列のデータを表示する(Sort1.java)
      (入力されるデータ数は最大で100個であるとする。また、一行に10個ずつ表示せよ)
      (一行当たりの表示個数が10以下になっても大丈夫なようにしておくこと!)
      例:
      データを入力して下さい。(負数で終了します。)
      2
      43
      555
      1
      38
      -1
      入力された配列データ:
      2      43     555    1      38
      ソート後の配列データ:
      1      2      38     43     555
      例2:
      データを入力して下さい。(負数で終了します。)
      2 43 555 1 38 -1
      入力された配列データ:
            2     43    555      1     38
      ソート後の配列データ:
            1      2     38     43    555
      中級:上の様に、改行やスペースで区切って、数値を入力するには Scannerクラス を使えば良いし、
         数値を右寄せで小数点位置を合わせて表示したければ System.out.printf() を使えば良い
    5. 「素数の列挙プログラム」
      素数を判定するメソッド(static boolean isPrime(int i);)を作成し、
      10,000より小さい素数を列挙するプログラム(ListPrime1.java)
      (一行に10個ずつ表示せよ)
    6. 「素数の列挙(エラトステネスの篩)プログラム」
      エラトステネスの篩を用いて10,000より小さい素数を列挙するプログラム(EraPrime1.java)
      (一行に10個ずつ表示せよ)
      (ウィキペディアより)
      ヒント:
      1. 配列 int n_prime[10000]; を用意し
      2. 合成数(素数の倍数)であると分かった i に対して、n_prime[i]=1 と印を付ける
      3. 初期値のまま残っている(n_prime[i]==0である)2以上の i が素数である
    7. 「数値処理プログラム」
      まず、処理するデータの個数を入力し、その個数のデータ(整数)を入力して配列に格納して、配列のデータを表示する。
      次に、配列内のデータの最小値、最大値、平均値(実数)を計算して表示する。
      そして、配列内のデータを昇順(小さい順)に並べ替えて、配列のデータを表示する(Stat1.java
      (配列内のデータは、, で区切り、[] で囲んで表示すること)
      ★今回はソートしてから最小値と最大値を求めては、練習にならないので、ダメです!
      例:
      処理するデータの個数を入力して下さい。
      10
      10個のデータを入力して下さい。
      4
      6
      24
      65
      7
      56
      3
      34
      5
      34
      入力された配列データ:
      [ 4, 6, 24, 65, 7, 56, 3, 34, 5, 34 ]
      最小値:3、最大値:65、平均値:23.8
      ソート後の配列データ:
      [ 3, 4, 5, 6, 7, 24, 34, 34, 56, 65 ]
        <裏技>
      キー入力するデータをファイル(data2.txt)に保存しておき、
      コマンドプロンプトのリダイレクションを利用して、
      Z:\java> java Stat1 < data2.txt
      としても良い。

      (キー入力がファイル入力に代わり、入力データは画面に表示されない)