Javaの配列参照付与{{Javaのはいれつ:さんしょうわりあて}}

21252 ワード

Javaの配列参照付与{{Javaのはいれつ:さんしょうわりあて}}
ここではJavaにおけるバブルソートを例に分析する
参照付与は、単純な付与操作ではなく、オブジェクトbに付与操作を行うことによって、オブジェクトaに対して値を変更することができる動作である.
//          n         num
int i;
for(i = 0; i < length; ++i)
	num[i] = n[i];

上記のプログラムでは、配列numの値を変更し、配列nは影響を受けません.
Javaでのバブルソートでは、main関数でバブルソートを使用することでソートの目的を達成します.
配列参照付与を使用すると、別のクラスのメソッドを使用してmain関数の配列を操作できます.
//Bubble.java
public class Bubble {
	public static void main(String[] args) {
		int[] num = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
		int length = 10;

		System.out.print("Original array is:");
		for(int i = 0; i < length; ++i)
			System.out.print(num[i] + " ");
		System.out.println();
		
		Bubbletest B = new Bubbletest(num, length);
		B.Sort();

		System.out.print("Sorted array is:");
		for(int i = 0; i < length; ++i)
			System.out.print(num[i] + " ");
		System.out.println();
	}
}

class Bubbletest{
	int[] num;
	int length;
	int tmp;
	boolean flag = false;
	
	Bubbletest(int[] n , int length) {
		int i;
		for(i = 0; i < length; ++i)
			num[i] = n[i];
		this.length = length;
	}
	
	void Sort() {
		for(int i = 1; i < length; ++i){
			for (int j = length - 1; j >= i; --j) {
				if(num[j - 1] > num[j]) {
					tmp = num[j - 1];
					num[j - 1] = num[j];
					num[j] = tmp;
					flag = true;
				}
			}
			if(!flag)
				break;
		}
	}
}

これは修正後のBubble.javaです.実行すると、配列値は変更されていません.プログラム出力は次の図のようになります.
Original array is:10 9 8 7 6 5 4 3 2 1 Sorted array is:10 9 8 7 6 5 4 3 2 1
これは,引用を行わずに賦値のみを行うことであり,引用賦値が行われていないことから,多くの作業が無駄であることが分かる.
以下は、参照付与後のBubble.javaです.
//Bubble.java
public class Bubble {
	public static void main(String[] args) {
		int[] num = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
		int length = 10;

		System.out.print("Original array is:");
		for(int i = 0; i < length; ++i)
			System.out.print(num[i] + " ");
		System.out.println();
		
		Bubbletest B = new Bubbletest(num, length);
		B.Sort();
		
		System.out.print("Sorted array is:");
		for(int i = 0; i < length; ++i)
			System.out.print(num[i] + " ");
		System.out.println();
	}
}

class Bubbletest{
	int[] num;
	int length;
	int tmp;
	boolean flag = false;
	
	Bubbletest(int[] n , int length) {
		num = new int[length];
		num = n;									//  “=”   n   num  
		this.length = length;
	}
	
	void Sort() {
		for(int i = 1; i < length; ++i){
			for (int j = length - 1; j >= i; --j) {
				if(num[j - 1] > num[j]) {
					tmp = num[j - 1];
					num[j - 1] = num[j];
					num[j] = tmp;
					flag = true;
				}
			}
			if(!flag)
				break;
		}
	}
}

Bubbletestのコンストラクション関数は、"="のみを使用して配列nをnum参照に渡すことに注意してください.最初のコードよりずっと簡単なコードは1行しかありませんが、これこそ本当の配列参照付与操作です.
この方法は配列オブジェクトだけでなく,Javaでは配列をオブジェクトとして実現するため,他のオブジェクトにも同様に適用される.