初学者にとって難関の一つメソッドの理解を何回かに分けてやっていく。
今回は最終回、
1回目
2回目
を先に学習するのはもちろんのこと。今回は配列の理解が必須だ。
配列に自信がない人は配列最終入門もやっておこう。
引数に配列
配列などの参照型変数を引数で渡した時の挙動を覚えよう。
まずは以下をコメントを読みながらMethodLesson10.javaを写経しよう。
import java.util.Arrays; public class MethodLesson10 { //第一引数にint型配列を受け取り、その要素を第二引数倍にするメソッド static void timesArray(int[] arr,int times){ //引数で入ってきたアドレスにある配列を直接書き換える for(int i=0;i<arr.length;i++){ arr[i]=arr[i]*times; } } public static void main(String[] args) { //[1,2,3]を要素とする配列をメモリ空間に作成し、その時のアドレスをarr1は保持 int[] arr1=new int[]{1,2,3}; //timesArrayにそのアドレスを渡す timesArray(arr1,2); //arr1にある配列の内容が書き換わったことを確認 System.out.println(Arrays.toString(arr1)); //さらにarr1の内容を3倍する。 timesArray(arr1,3); //arr1の値がさらに3倍されたことを確認 System.out.println(Arrays.toString(arr1)); } }
アドレス値をやりとりしているので操作している配列がメモリ空間に一つしかないことを意識することが大切だ。(new したのは一回)
やってみよう
1.MethodLesson11.javaを作成する。
2.引数で受け取った配列を逆順にするメソッド
static void arrReverse(int[] arr){
処理
}
を作成する。
3.mainメソッド内で要素が[1,2,3,4,5]の配列を作成する。(配列変数名:arr)
4.配列を2で作ったメソッドを使って逆順にする。
5.Arrays.toString(arr)を用いて結果が[5,4,3,2,1]となっていることを確認する。
解)
import java.util.Arrays; public class MethodLesson11 { //引数で受け取った配列を逆順にするメソッド static void arrReverse(int[] arr){ for(int i=0;i<arr.length/2;i++){ int temp=arr[i]; arr[i]=arr[arr.length-1-i]; arr[arr.length-1-i]=temp; } } public static void main(String[] args) { int[] arr=new int[]{1,2,3,4,5}; arrReverse(arr); System.out.println(Arrays.toString(arr)); } }
配列の戻り値
戻り値として配列を指定することもできる。
MethodLesson12を写経する。
●MethodLesson12.java
import java.util.Arrays; public class MethodLesson12 { //第一引数にint型配列を受け取り、その要素を第二引数倍にした要素をもつ新しい配列を返却するメソッド static int[] timesArray(int[] arr, int times) { //引数で渡ってきた配列と同じ要素数の配列をメモリ空間に新しく作成 int[] retArr = new int[arr.length]; //新しい配列の要素に引数で渡ってきた要素をtimes倍した値を入れる。 for (int i = 0; i < retArr.length; i++) { retArr[i] = arr[i] * times; } //新しく作成した配列(のアドレス)を返却 return retArr; } public static void main(String[] args) { // [1,2,3]を要素とする配列をメモリ空間に作成し、その時のアドレスをarr1は保持 int[] arr1 = new int[] { 1, 2, 3 }; // timesArrayによって新しく作られた配列を受け取る int[] arr2 = timesArray(arr1, 2); // arr1はそのまま[1,2,3] System.out.println(Arrays.toString(arr1)); // arr2は[2,4,6] System.out.println(Arrays.toString(arr2)); //要素を3倍にした新しい配列のアドレスを受け取る int[] arr3 = timesArray(arr2, 3); // arr3は[6,12,18] System.out.println(Arrays.toString(arr3)); } }
処理の流れを追うとnewを3回しているのがわかる。メモリ空間上にも3つの配列が確保されている。
配列などの参照型を扱う際はこのメモリ空間を意識することが大切だ。
やってみよう
○MethodLesson13.javaを作成し以下の処理を実現せよ。
2つのint型配列を引数で受け取り、それを結合した配列を返すメソッドを作成せよ。
static int[] arrMerge(int[] arr1,int[] arr2){}
Mainメソッドにて{1,2,3}と{4,5,6,7}の配列を結合した{1,2,3,4,5,6,7}という配列を作成せよ。
import java.util.Arrays; public class MethodLesson13 { public static void main(String[] args) { int[] arr1={1,2,3}; int[] arr2={4,5,6,7}; int[] arr3=arrMerge(arr1,arr2); System.out.println(Arrays.toString(arr3)); } public static int[] arrMerge(int[] arr1,int[] arr2){ int[] retArr=new int[arr1.length+arr2.length]; for(int i=0;i<retArr.length;i++){ if(i<arr1.length){ retArr[i]=arr1[i]; }else{ retArr[i]=arr2[i-arr1.length]; } } return retArr; } }
○MethodLesson14.javaを作成し以下の処理を実現せよ。
1.2つのint型引数を受け取るとその範囲を要素とする 配列を作成し返却するメソッドを以下のように作成する。
(例 引数として(2,4)と渡すと[2,3,4]、(2,-1)と渡すと[2,1,0,-1]という配列を作成する)
//引数として最初の値と最後の値を受け取り、その範囲を要素とする配列を返却するメソッド static int[] makeArrFirstToLast(int first,int last){ //絶対値を使って要素数をもとめ配列をnewする。 int[] retArr=new int[Math.abs(first-last)+1]; 処理を書く return retArr; }
2.mainメソッドから上記メソッドに(4,-2)の引数を渡して実行する。
3.Arrays.toString()を使って[4,3,2,1,0,-1,-2]の配列が作成できていることを確認する。
解)
package method; import java.util.Arrays; public class MethodLesson13 { //引数として最初の値と最後の値を受け取り、その範囲を要素とする配列を返却するメソッド static int[] mekeArrFirstToLast(int first,int last){ //絶対値を使って要素数をもとめ配列をnewする。 int[] retArr=new int[Math.abs(first-last)+1]; for(int i=0;i<retArr.length;i++){ retArr[i]=first<last ? first++:first--; } return retArr; } public static void main(String[] args) { int[] arr=mekeArrFirstToLast(4,-2); System.out.println(Arrays.toString(arr)); } }
コメント