配列を受け取るメソッド

メソッドは引数として配列を受け取ることもできます。 ここでは、配列を受け取るメソッドについて学習していきましょう。

受け取った配列に応じた処理をする

配列を受け取ったメソッドは、その配列の長さや要素に応じた処理をすることができます。 まず、第8章の配列の応用のところで学習したArraySample03をもう一度見てください。 これは、5人の生徒のテストの得点を表示してから、最高得点を取った生徒の番号とその得点を表示するプログラムでした。

ArraySample03.java(再掲)
class ArraySample03 {
    public static void main(String[] args) {
        int[] a = {64, 75, 40, 92, 58};

        for(int i = 0; i < a.length; i++){
            System.out.println((i + 1) + "番の人の得点は" + a[i] + "点です。");
        }

        int imax = 0;
        for(int i =1 ; i < a.length; i++){
            if(a[i] > a[imax]){
                imax = i;
            }
        }
        System.out.println("最高得点は" + (imax + 1) + "番の人の" + a[imax] + "点です。");
    }
}
ArraySample03の実行結果
1番の人の得点は64点です。
2番の人の得点は75点です。
3番の人の得点は40点です。
4番の人の得点は92点です。
5番の人の得点は58点です。
最高得点は4番の人の92点です。

メソッドを使って、ArraySample03を書き換えてみましょう。 それが次のMethodSample08です。

MethodSample08.java
class MethodSample08 {
    static int indexOfMax(int[] x){
        int imax = 0;
        for(int i =1 ; i < x.length; i++){
            if(x[i] > x[imax]){
                imax = i;
            }
        }
        return imax;
    }

    public static void main(String[] args) {
        int[] a = {64, 75, 40, 92, 58};

        for(int i = 0; i < a.length; i++){
            System.out.println((i + 1) + "番の人の得点は" + a[i] + "点です。");
        }

        int imax = indexOfMax(a);
        System.out.println("最高得点は" + (imax + 1) + "番の人の" + a[imax] + "点です。");
    }
}

実行結果はArraySample03と同じです。

indexOfMaxは、配列の要素の中で最大値となっているものの最初のインデックスを返すメソッドです。 indexOfMaxメソッドの仮引数は、 int[] x と宣言されています。 つまり、仮引数が配列変数となっているのです。

mainメソッドでは、生成された配列本体への参照が、配列変数aに代入されます。 そして、indexOfMaxメソッドが呼び出されると、仮引数xは実引数aの値によって初期化されます。 従って、xはaと同じ配列本体を参照することになります。 この様子を示したのが図 9-6です。

本節で扱うメソッドは、厳密に言えば配列本体への参照を受け取るメソッドですが、話を簡単にするため、配列を受け取るメソッドという言い方をしています。

図 9-6 : 受け取った配列に応じた処理をする

indexOfMaxメソッドの中では、配列変数xを使って、配列本体の長さや各要素の値を調べることができます。

仮引数の配列変数は、実引数の配列変数と同じ配列本体を参照する。

受け取った配列の内容を変更する

MethodSample08は、受け取った配列の要素を調べて利用するだけでした。 今回は、要素の値を変更してみましょう。

今度も、同じく第8章の配列の応用で登場したArraySample04を書き換えてみたいと思います。 これは、配列に格納されたテストの得点を高い順にソートするプログラムでした。

ArraySample04.java(再掲)
class ArraySample04 {
    public static void main(String[] args) {
        int[] a = {64, 75, 40, 92, 58};

        for(int i = 0; i < a.length-1; i++){
            for(int j = i+1; j < a.length; j++){
                if(a[j] > a[i]){
                    int temp = a[i];
                    a[i] = a[j];
                    a[j] = temp;
                }
            }
        }

        for(int i = 0; i < a.length; i++){
            System.out.println((i + 1) + "位の人の得点は" + a[i] + "点です。");
        }
    }
}
ArraySample04の実行結果
1位の人の得点は92点です。
2位の人の得点は75点です。
3位の人の得点は64点です。
4位の人の得点は58点です。
5位の人の得点は40点です。

メソッドを使ってArraySample04を書き換えたものが、次のMethodSample09です。

MethodSample09.java
class MethodSample09 {
    static void descendingSort(int[] x){
        for(int i = 0; i < x.length-1; i++){
            for(int j = i+1; j < x.length; j++){
                if(x[j] > x[i]){
                    int temp = x[i];
                    x[i] = x[j];
                    x[j] = temp;
                }
            }
        }
    }

    public static void main(String[] args) {
        int[] a = {64, 75, 40, 92, 58};

        descendingSort(a);

        for(int i = 0; i < a.length; i++){
            System.out.println((i + 1) + "位の人の得点は" + a[i] + "点です。");
        }
    }
}

実行結果はArraySample04と同じです。

descendingSortは、受け取った配列の要素を大きい順に並べ替えるメソッドです。

descendingSortメソッドが呼び出されると、仮引数xは実引数aと同じ配列本体を参照します。 従って、メソッド内で配列の内容を変更してmainメソッドに戻った後も、配列変数aを使って、変更された要素の値を調べることができます。 この様子を示したのが図 9-7です。

図 9-7 : 受け取った配列の内容を変更する