初学者にとって難関の一つメソッドの理解を何回かに分けてやっていく。
今回は最終回、
1回目
2回目
を先に学習するのはもちろんのこと。今回は配列の理解が必須だ。
配列に自信がない人は配列最終入門もやっておこう。
引数に配列
配列などの参照型変数を引数で渡した時の挙動を覚えよう。
まずは以下をコメントを読みながらMethodLesson10.javaを写経しよう。
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 したのは一回)
やってみよう
- MethodLesson11.javaを作成する。
- 引数で受け取った配列を逆順にするメソッド(reverseArray)を作成する
static void reverseArray(int[] arr){
処理
}
- mainメソッド内で要素が[1,2,3,4,5]の配列を作成する。(配列変数名:arr)
- 配列をreverseArrayを使って逆順にする。
- Arrays.toString(arr)を用いて結果が[5,4,3,2,1]となっていることを確認する。
import java.util.Arrays;
public class MethodLesson11 {
//引数で受け取った配列を逆順にするメソッド
static void reverseArray(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};
reverseArray(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;
}
}
コメント