1

この記事の目次



1.  引数に配列を用いる


メソッドの引数にはint型やString型などの変数だけでなく、以下の例のように配列も使うことができます。

例:引数が配列の場合
package helloworld;
 
public class HelloWorld {
        
    public static void main(String[] args) {
        int[] array = {1,2,3};
        printArray(array);
    }
      
    static void printArray(int[] a) {
        //拡張for文を利用する
        for(int e: a){
            System.out.println(e);
        }
    }
      
}

メソッドを呼び出すときに引数として基本データ型の変数を指定した場合、メソッドに渡されるのは変数そのものではなく、変数に入っている値です。このように、値そのものが渡される呼び出しを値渡しと呼びます。

  • 呼び出し元の変数の内容は、呼び出し先の引数にコピーされる。
  • 呼び出し先で引数の内容を書き換えても、呼び出し元の変数は変化しない。
  • しかし、メソッド呼び出しの際に普通の変数ではなく、配列を渡すと不思議なことが起こります。

  • まず、メソッド呼び出しの際にコピーされるのは配列の内容(=1,2,3)ではなく配列の先頭要素のアドレス(例えば1210番地)です。
  • すると、mainメソッド内の変数arrayとprintArrayメソッド内の引数aはどちらも1210番地以降にある配列の実態を参照した状態になります。
  • もし、printArrayメソッド内の引数aの内容を{100,200,300}に変えたら(以下の例を参考)、mainメソッド内の変数arrayも{100,200,300}に変わってしまいます。つまり、1つの配列を複数の配列変数で参照することになり、呼び出し先で配列の実態を書き換えると、呼び出し元にも影響します。また、このように、アドレスが渡される呼び出しは参照の値渡しと呼びます。
  • package helloworld;
      
    public class HelloWorld {
            
        public static void main(String[] args) {
            int[] array = {1,2,3};
            printArray(array);
            
            System.out.println("\nmainメソッドで定義したarray変数の内容: "); 
            for(int e: array){
                System.out.print(e + "  ");
            }
        }
          
        static void printArray(int[] a) {
            //配列変数aの内容を変える
            for (int i = 0; i< a.length; i++)
                a[i] *= 100;
            System.out.println("printArrayメソッド内の配列変数aの内容: "); 
            for(int e: a){
                System.out.print(e + "  ");
            }
        }
          
    }

    実行結果:
    printArrayメソッド内の配列変数aの内容: 
    100  200  300  
    mainメソッドで定義したarray変数の内容: 
    100  200  300

    2.  戻り値に変数を用いる


    引数と同様に、戻り値に配列を使用することができます。

    例:戻り値が配列の場合
    package helloworld;
      
    public class HelloWorld {
            
        public static void main(String[] args) {
            int[] array = creatArray(5);
            //配列の全要素を出力する
            for(int e: array){
                System.out.print(e + "  ");
            }
        }
          
        static int [] creatArray(int size) {
            int[] a = new int[size];
            for (int i = 0; i< size; i++)
                a[i] = i;
            return a;                       //配列を戻す
        }
          
    }

  • 配列を戻す時に、配列そのものを戻しているわけではなく、配列の先頭要素のアドレスを戻しています。
  • 上の例では、「return a;」によって、配列の先頭要素のアドレスがmainメソッドに戻されます。mainメソッドでは、それを地震で宣言した配列変数arrayに代入します。その結果、creatArrayメソッドで作成された配列を参照できるようになります。
  • 3.  配列を扱うメソッド


     ●  最大値を求めるメソッド

    問題:int型の配列を宣言し、初期化する。その配列の要素から最大値を求めるメソッドを作成しましょう

    解答例
    配列の要素から最大値を求めるメソッド
    package helloworld;
      
    public class HelloWorld {
            
        public static void main(String[] args) {
            int[] array = {2,5,3,8,3,1};     //配列を宣言し、初期化する
            
            int max = maxOf(array);         //maxOfメソッドでarrayの最大値を求め、maxに代入する
            System.out.println("最大値: " + max);
        }
          
        static int maxOf(int[] a) {
            int max = a[0];                 //最初に、配列aの最初の要素を最大値にする
            for(int e:a)
                if (max < e)
                        max = e;            //現在の最大値より大きい値に最大値を更新する
            return max;                     //最大値を戻す
        }
          
    }

    実行結果:
    最大値: 8
  • maxOfメソッドは配列の要素の最大値を求めて返却するメソッドです。配列を受け取るための仮引数は、int[]aと宣言されています、これは配列変数の宣言と同じ形式です。
  • 実引数のarrayは、配列本体を参照する並列変数ですから、メソッドmaxOfに渡されるのは、「配列本体への参照」です。
  • 呼び出されたメソッドmaxOfでは、配列変数である仮引数aが、受け取った参照で初期化されます。その結果、配列変数aは配列arrayの本体を参照することになります。換言すると、メソッドmaxOf内の配列aは、事実上mainメソッドの配列arrayのことになり、配列の代入と同じです。
  •  ●  線形探索

    問題:配列を宣言し、初期化する。その配列とint型のkey変数を実引数として、配列内の要素からkeyと等しい要素の番地を出力するメソッドを作成しましょう。

    注意 : 配列内の要素からkeyと等しい要素は1つだと限らないため、メソッドの戻り値をArrayListにしましょう。

    解答例
    例:線形探索
    package helloworld;
      
    import java.util.ArrayList;
    
    public class HelloWorld {
            
        public static void main(String[] args) {
            int[] array = {2,5,3,8,3,1};     //配列を宣言し、初期化する
            int key = 3;                    //探索keyを宣言し、初期化する
            
            ArrayList< Integer > listIdx= linearSearch(array,3);         //linearSearchメソッドでkeyと等しい要素の番地のリストを求め、listIdxに代入する
            System.out.println(key + "と等しい要素の番地: " + listIdx);
        }
          
        static ArrayList< Integer > linearSearch(int[] a, int key) {
            ArrayList< Integer > list = new ArrayList<>();   //ArrayListを宣言する
            for(int i=0; i< a.length ; i++)
                if (key == a[i])
                        list.add(i);            //keyと等しい要素の番地をlistに追加する
            return list;                        //keyと等しい要素の番地のリストを戻す
        }
          
    }

    実行結果:
    3と等しい要素の番地: [2, 4]
  • 整形探索を行うのはメソッドlinearSearchです。配列aからkeyと一致する要素を線形探索します。この探索メソッドはArrayListを使っていますので、木になる方はArrayListの記事をご覧ください。
  •  JAVAのArrayListについて詳しく見たい方:

    JAVAのArrayList

    ../../../java/java-collection-arraylist.html

    この記事ではListを実装したクラスの一つであるArrayListを紹介します。ArrayListは大きさが可変という点でたくさんの応用があるので、開発現場でよく・・・

     ●  配列の要素の並びを反転する

    問題:配列の要素の並びを反転するメソッドを作成しましょう。

    解答例
    配列の要素に値を読み込んで並びを反転する
    package helloworld;
      
    import java.util.ArrayList;
    
    public class HelloWorld {
            
        public static void main(String[] args) {
            int[] array = {2,5,3,8,3,1};     //配列を宣言し、初期化する
            //arrayの全要素を出力する
            System.out.print("元のarray: ");
            for(int e:array)
                System.out.print(e + "  ");
            
            array = reverse(array);         //reverseメソッドでarrayの反転した配列を求め、元のarrayに代入する
            System.out.print("\narrayの反転したarray: ");
            for(int e:array)
                System.out.print(e + "  ");
        }
          
        static int[] reverse(int[] a) {
            for(int i=0; i< a.length/2 ; i++){
                int b = a[i];
                a[i] = a[a.length - i - 1];
                a[a.length - i - 1] = b;
            }
                
            return a;                        //反転した配列を戻す
        }
          
    }

    実行結果:
    元のarray: 2  5  3  8  3  1  
    arrayの反転したarray: 1  3  8  3  5  2
  • 並び替えを行うのはメソッドreverseです。配列の要素の並びを反転するために、2要素の値の交換を(要素数/2)回行なっています。
  • mainメソッドで生成した配列への参照arrayがreverseに渡されます。したがって、メソッドreverseの仮引数aはmainメソッド内でarrayとして生成した配列本体を参照することになります。
  •  ●  二つの配列の比較

    問題:二つの配列が等しいかどうかを判定するメソッドを作成しましょう。

    解答例
    配列の比較
    package helloworld;
    
    public class HelloWorld {
            
        public static void main(String[] args) {
            //配列を宣言し、初期化する
            int[] array1 = {2,5,3,8,3,1};     
            int[] array2 = {2,5,3,8,3,1};   
            int[] array3 = {2,5,4,8,3,1,5};     
            
            //arrayの全要素を出力する
            System.out.print("array1: ");
            for(int e:array1)
                System.out.print(e + "  ");
            System.out.print("\narray2: ");
            for(int e:array2)
                System.out.print(e + "  ");
            System.out.print("\narray3: ");
            for(int e:array3)
                System.out.print(e + "  ");
            
            System.out.println("\n\n配列array1とarray2とは" + 
                    (equals(array1, array2) ? "等しいです。" : "等しくありません"));
            System.out.println("配列array2とarray3とは" + 
                    (equals(array2, array3) ? "等しいです。" : "等しくありません"));
            
        }
          
        static boolean equals(int[] a,int [] b) {
            if(a.length != b.length)
                return false;
            for (int i = 0; i < a.length; i++)
                if(a[i] != b[i])
                    return false;
                
            return true;                        
        }
          
    }

    実行結果:
    array1: 2  5  3  8  3  1  
    array2: 2  5  3  8  3  1  
    array3: 2  5  4  8  3  1  5  
    
    配列array1とarray2とは等しいです。
    配列array2とarray3とは等しくありません

    メソッドequalsは2つの配列aとbの全要素が等しいかどうかを判定し、その結果に応じて、trueもしくはfalseを返却します。判定は以下に示す3つのステップで行います。

  • プログラムの30-31行目:2つの配列a,bの要素数を比較します。要素数が異なれば、配列が等しくないことは明らかですがら、falseを返します、
  • プログラムの32-34行目:このfor文では2つの配列を先頭から捜査しながら要素a[i]とb[i]の値の比較を繰り返します。その過程で値が異なる要素を見つけると、return文を実行することによって、falseを返すます。
  • プログラムの36行目:プログラムの流れがここに到着するのは、for文が中断されることなく、最後まで実行された場合です。2つの配列は等しいと判断できますのでtrueを返すます。
  • 4.  まとめ


    JAVA言語のメソッドと配列は最も基礎な知識です。この記事により、メソッドの引数に配列を用いたり、戻り値に変数を用いたりすることを紹介しますした。それに、メソッド内で、配列を扱って処理仕方も紹介し、応用問題も提供しました。まだ学習したい方は以下の演習問題をぜひご覧ください。

    5.  演習問題


    広告